@boatseller が言うように、HL7 逆アセンブラーがマルチパート メッセージを作成するのを防ぐことはできません。
他の質問について: カスタム パイプライン コンポーネントを作成して HL7 確認応答を送り返し、独自のフラット ファイル スキーマを使用することができます (すぐに使用できるフラットファイル逆アセンブラー パイプライン コンポーネントを使用)。
1. 双方向受信ポートを使用します。
これは、MLLP アダプターを使用した場合でも、双方向ポートを使用して機能するはずですが、すべてを検証およびテストし、Microsoft が HL7 2.X 逆アセンブラー パイプラインを使用せずに MLLP アダプターを使用したり、以下に提案する方法。
2. リクエストとレスポンスを関連付けます。
BizTalk で応答のサブスクリプションを作成するには、受信場所のパイプラインにカスタム パイプライン コンポーネントが必要です。Pipeline Component Wizardを使用して、コンポーネントの作成を開始します。
カスタム パイプライン コンポーネント クラス ( IComponent インターフェイスの実装から取得)のExecute メソッドで、次のコードに似たものを記述します。
public Microsoft.BizTalk.Message.Interop.IBaseMessage Execute(Microsoft.BizTalk.Component.Interop.IPipelineContext pc, Microsoft.BizTalk.Message.Interop.IBaseMessage inmsg)
{
const string sysPropertyNamespace = "http://schemas.microsoft.com/BizTalk/2003/system-properties";
var epmToken = inmsg.Context.Read("EpmRRCorrelationToken", sysPropertyNamespace);
var correlationToken = epmToken != null
? (string) epmToken
: Guid.NewGuid().ToString();
inmsg.Context.Promote("EpmRRCorrelationToken", sysPropertyNamespace, correlationToken);
inmsg.Context.Promote("RouteDirectToTP", sysPropertyNamespace, true);
return inmsg;
}
EpmRRCorrelationToken
オーケストレーションを使用しない要求応答メッセージ処理の使用またはRouteDirectToTP
プロパティについては、この MSDN ブログ投稿に記載されています。
3. 確認を作成して送信する
送信パイプライン内で別のカスタム パイプライン コンポーネントを使用して、入力メッセージに基づいて確認応答を手動で作成できます。おそらく、実行時に読み取られる追加のパイプライン コンポーネント構成を使用します。
最初のカスタム パイプライン コンポーネントと同様に、IComponent インターフェイスの Execute メソッドを実装できます。次のようなコードが機能するはずです。
public Microsoft.BizTalk.Message.Interop.IBaseMessage Execute(Microsoft.BizTalk.Component.Interop.IPipelineContext pc, Microsoft.BizTalk.Message.Interop.IBaseMessage inmsg)
{
string msgOut;
var bodyPart = inmsg.BodyPart;
if (bodyPart == null)
return inmsg; // Maybe throw an exception instead?
var inboundStream = new ReadOnlySeekableStream(bodyPart.GetOriginalDataStream());
inboundStream.Position = 0;
using (var reader = new StreamReader(inboundStream))
{
var builder = new StringBuilder();
// Read the input stream's first line - this should be the MSH segment:
var firstLine = reader.ReadLine();
// TODO: read search/replacement values from pipeline configuration
// TODO: make a better ACK header than this
builder.AppendLine(firstLine.Replace("ADT^A01", "ACK"));
// Construct your acknowledgement segment, preferably without hardcoding it here:
builder.AppendLine("MSA|AA|ADT^A01");
msgOut = builder.ToString();
}
// Write out the output
var outputStream = new VirtualStream();
var writer = new StreamWriter(outputStream, Encoding.Default);
writer.Write(msgOut);
writer.Flush();
outputStream.Seek(0, SeekOrigin.Begin);
inmsg.BodyPart.Data = outputStream;
pc.ResourceTracker.AddResource(inboundStream);
pc.ResourceTracker.AddResource(outputStream);
return inmsg;
}
インライン TODO を処理し、より多くの null チェックを追加すること以外は、かなり完全なソリューションになるはずですが、特に有効な HL7 確認メッセージを返す場合は、マイレージが異なる場合があります。
ボーナス。オーケストレーションを使用しないのはなぜですか?
これは質問へのコメントで尋ねられました。オーケストレーションの代わりにカスタム パイプライン コンポーネントを使用するいくつかの理由を次に示します。
- オーケストレーションが遅い。Microsoft は、独自のオーケストレーション パフォーマンスの最適化に関する記事で、可能であればオーケストレーションの使用を避けるべきだと述べています。オーケストレーションでは、BizTalk メッセージ ボックス データベースへの余分なラウンドトリップが必要になり、BizTalk サーバーで追加のプロセスとスレッドが起動されるため、待機時間と応答時間が長くなります。
- 確認応答がより速く返されます。HL7 統合では、通常、承認/受信確認を使用します。多くのシステムは、最後に送信されたメッセージが確認されるまで、追加のメッセージを送信しません。したがって、オーケストレーションがスピンアップするまで待機し、入力を読み取り、ACK 出力を作成し、ポートに ACK を返し、ACK を送り返す必要がある場合、処理が大幅に遅くなります。はい、これは上記の #1 と似ていますが、理解することが重要です。
- オーケストレーションにより、ソリューションがより失敗しやすくなります。オーケストレーションは、もう 1 つの障害点です。ACK を生成するオーケストレーションまたは関連する ホスト インスタンスをオフラインにする必要がある場合は、メッセージを受信できなくなります。BizTalk の大きな利点は、統合ソリューションのさまざまな部分を分離して、高可用性と信頼性の向上を実現できることです。分離された受信ポートのパイプライン コンポーネントが受信メッセージを BizTalk メッセージ ボックスに発行しただけで受信確認を返すと、内部システム/コンポーネントがダウンしていても、メッセージの受信を続行できます。