メッセージの分割は、逆アセンブラー コンポーネントでのみ実行できます。(Selvin が行ったように) 既存の逆アセンブラーから継承するクラスを作成するか、パイプライン コンポーネント ウィザードで受信パイプライン タイプの "DisassemblyParser" コンポーネント タイプを作成するように指定できます。継承は、設計時のプロパティを再利用できるが必須ではない場合に役立ちます。
実行されると、BizTalk は "逆アセンブル" メソッドを介してメッセージを渡します。このメソッドが返された後、BizTalk は "GetNext" メソッドのポーリングを開始し、null が返されるまですべての出力メッセージを取得します。そのため、BizTalk が "GetNext" を呼び出したときに必要な分割メッセージを返すことができるように、"逆アセンブル" メソッドでメッセージを準備する方法を設計する必要があります。
セルバンのアプローチは次のとおりです。
- 「逆アセンブル」では、フラット ファイル全体を BizTalk のフラット ファイル逆アセンブラー (base.Disassemble) で XML に変換し、基本クラスに XML 出力を格納させます。
- BizTalk が "GetNext" を初めて呼び出すと、分割されていない XML メッセージが基本クラス (base.GetNext) から取得され、XPathDocument に読み込まれ、ノード数に基づいて分割されます。パーツごとに新しいメッセージが作成され、コレクションに保存されます。
- 「GetNext」を呼び出すたびに、すべてのメッセージが返されるまで、メッセージ コレクションからメッセージの 1 つが返されるため、メソッドは「null」を返します。
彼が指摘しているように、XPathNavigator の使用は非常に大きなメッセージには適していません。メッセージをメモリに完全に読み込まずにストリームとして処理できるように、可能な限り XmlReader を使用することをお勧めします。これは、GetNext プロセスを次のように再設計することで実行できます。
- 初めて呼び出され、逆アセンブルされた XML メッセージ ストリームの XmlReader を作成します。
- GetNext を呼び出すたびに、XmlReader を使用して必要な数のノードを先読みし、新しい BizTalk メッセージで返される新しい出力ストリームに書き込みます。
- XML メッセージの最後に到達したら、リーダーを閉じて null を返すことができます。
あなたの説明から、フラット ファイルを XML に逆アセンブルせずに出力したい場合があるように思えます。その場合、Disassembly が呼び出されたときに入力ストリームを保存し、同じ GetNext デザインを使用することをお勧めしますが、XmlReader の代わりに StreamReader を使用します。 .