パイプラインを実行する式の使用方法
BizTalk Serverには、オーケストレーション内からパイプラインを同期的に呼び出す機能があります。 これにより、オーケストレーションで、パイプライン (送信または受信) にカプセル化されたメッセージ処理をデータの本体に対して利用することができます。そのデータをメッセージング インフラストラクチャに送信する必要はありません。
この機能を使用すると、オーケストレーションから送信パイプラインを呼び出して、複数のメッセージを 1 つの送信インターチェンジに統合することができます。 反対に、オーケストレーションから受信パイプラインを呼び出して、メッセージング インフラストラクチャの外部で取得されたインターチェンジをデコードおよび逆アセンブルすることもできます。メッセージ ボックスを通過する場合の処理コストが発生することもありません。
詳細
オーケストレーションでは、 XLANGPipelineManager クラス ( Microsoft.XLANGs.Pipeline 名前空間内) のメソッドを使用して、送信パイプラインまたは受信パイプラインを呼び出します。 受信パイプラインは、BizTalk メッセージングのメッセージ受信のコンテキストでパイプラインが実行される場合と同じように、単一のメッセージまたはインターチェンジを処理して 0 個以上のメッセージを生成します。 送信パイプラインも、BizTalk メッセージングのメッセージ送信のコンテキストでパイプラインが実行される場合と同じように、1 つ以上のメッセージを処理して単一のメッセージまたはインターチェンジを生成します。
受信パイプラインの呼び出し
オーケストレーション内から受信パイプラインを呼び出すために、アプリケーションは XLANGPipelineManager クラスの ExecuteReceivePipeline() メソッドを呼び出します。 このメソッドは、1 つのインターチェンジを使用し、0 個以上のメッセージのコレクションを返します ( ReceivePipelineOutputMessages クラスのインスタンスに含まれます)。 このメソッドの構文については、 XLANGPipelineManager クラスの .NET クラス ライブラリ リファレンスで詳しく説明されています。
オーケストレーションから受信パイプラインを実行するための API を以下に示します。
// Execute receive pipeline
static public ReceivePipelineOutputMessages ExecuteReceivePipeline(System.Type receivePipelineType, XLANGMessage msg);
通常、受信パイプラインの呼び出しは、オーケストレーション内の 式 図形で行われます。
オーケストレーションから受信パイプラインを呼び出すには、オーケストレーション プロジェクトでパイプライン アセンブリを参照する必要があります。 次に、受信パイプラインを呼び出すオーケストレーションの例を示します。
詳細な例については、SDK サンプル構成済みメッセージ プロセッサ (BizTalk Server サンプル) を参照してください。
Note
ReceivePipelineOutputMessages 型の変数は、オーケストレーション内のアトミック スコープ内でのみ宣言できます。 この型の変数はシリアル化できないため、オーケストレーションの永続化が維持されないからですが、オーケストレーションはアトミックのスコープ内で実行されるときは永続化されません。 したがって、受信パイプラインはアトミックのスコープ内でしか実行できないことになります。
Note
オーケストレーション内から PassThruReceive パイプラインまたはカスタム パイプライン コンポーネントを呼び出す場合は、受信メッセージの変数型を System.Xml として宣言する必要があります。受信メッセージの種類に関わらず XmlDocument が XML かどうか。 したがって、受信メッセージが XML メッセージ以外 (フラット ファイル形式のメッセージなど) の場合は、処理しようとすると例外が発生します。 これは、オーケストレーション エンジンが上記のシナリオでは受信メッセージの種類に関係なく System.Xml.XmlDocument を使用するためです。
送信パイプラインの呼び出し
オーケストレーション内から送信パイプラインを呼び出すには、アプリケーションは XLANGPipelineManager クラスの ExecuteSendPipeline() メソッドを呼び出します。 このメソッドは、( SendPipelineInputMessages クラスのインスタンスに含まれる) 1 つ以上のメッセージのコレクションを使用し、1 つのインターチェンジを返します。 このメソッドの構文については、 XLANGPipelineManager クラスの .NET クラス ライブラリ リファレンスで詳しく説明されています。 送信パイプラインを実行すると新しいインターチェンジが生成されるため、 ExecuteSendPipeline() メソッドの呼び出しは、次のようにメッセージ割り当て図形内で行う必要があります。
オーケストレーションから送信パイプラインを実行するための API を以下に示します。
// Execute a send pipeline
static public ExecuteSendPipeline(System.Type sendPipelineType, SendPipelineInputMessages inputMsgs, XLANGMessage msg);
送信パイプラインの呼び出しは、オーケストレーション内の メッセージ割り当て 図形で行う必要があります。
オーケストレーションから送信パイプラインを呼び出すには、オーケストレーション プロジェクトでパイプライン アセンブリを参照する必要があります。 次に、送信パイプラインを呼び出すオーケストレーションの例を示します。
Note
既定の XMLTransmit パイプラインを呼び出す際には、メッセージ コンテキスト プロパティの XMLNORM.EnvelopeSpecName をエンベロープ スキーマの完全修飾名に設定する必要があります。 次に例を示します。
MyMessage(XMLNORM.EnvelopeSpecName) = "PipelineSchemas.POEnv, PipelineSchemas, Version=1.0.0.0, Culture=nuetral, PublicKeyToken=12e5cc95621c33e8";
詳細な例については、SDK サンプル アグリゲーター (BizTalk Server サンプル) を参照してください。
パイプラインの実行の動作の違い
送信パイプラインや受信パイプラインは、オーケストレーションによって呼び出された場合も、メッセージング インフラストラクチャ内 (受信場所や送信ポート) で実行された場合とほとんど同じように実行されます。 ただし、次に示すような動作の違いもあります。
パイプラインのステージ内の違い
送信パイプラインや受信パイプラインのステージは、パイプラインがオーケストレーションから呼び出された場合も、パイプラインが BizTalk メッセージング インフラストラクチャから呼び出された場合とほとんど同じように実行されますが、次に示すような例外もあります。
アセンブラー/逆アセンブラー: アセンブラーステージと逆アセンブラーステージは 追跡プロファイル データを処理しません。
エンコーダー/デコーダー: MIME エンコーダーは、ホストが関連付けられているホストで構成された証明書を使用して、メッセージにデジタル署名します。 SMIME エンコーダーでは、パイプラインに渡されたメッセージのコンテキストの証明書を使用してメッセージが暗号化されます。
スキーマの解決
オーケストレーションからパイプラインを実行する際には、次の 2 つのスキーマ検索アルゴリズムがサポートされます。
種類による解決
名前による解決
重複するスキーマが展開されていた場合に適切なスキーマを選択するアルゴリズムのロジックは、メッセージング インフラストラクチャのコンテキストで実行された場合に使用されるものと同じです。
トランザクション パイプライン
トランザクション コンポーネントを呼び出すステージがあるパイプラインでは、トランザクション コンテキストを使用できません。 IPipelineContext.GetTransaction() を呼び出すと、NotSupportedException がスローされます。 このようなパイプラインをオーケストレーションから実行できないわけではありませんが、パイプラインでこの状況を検出して処理する必要があります。
メッセージ送信先
パイプライン コンポーネントによるメッセージ送信先の制御は、このコンテキストではサポートされません。 コンテキスト プロパティ MessageDestination または SuspendOnRoutingFailure を設定すると、 XLANGPipelineManagerException がスローされます。
パイプライン コンポーネントの種類
オーケストレーションから呼び出すには、パイプライン コンポーネントが次のいずれかに基づいている必要があります。
NET Framework Version 1.1
NET Framework Version 2.0
.NET Framework Version 3.0
.NET Framework Version 3.5
.NET Framework Version 4.0
NET Framework Version 2.0
COM (COM)
制限
次の種類のパイプラインは 、 オーケストレーション内から実行できません。
トランザクション パイプライン
回復可能パイプライン。
BAM インターセプター API を呼び出すパイプライン ( NotSupportedException がスローされます)。
同じパイプライン インスタンスを並列図形の別の分岐で実行することはできません (すべての分岐で同期されたスコープに配置されている場合を除く)。
BizTalk Server 2006 SDK に対して構築された既存のパイプライン (アセンブリ)。
エラー モードと結果
パイプラインの実行で、BizTalk Server メッセージング インフラストラクチャから呼び出された場合はメッセージを保留するようなエラーが発生した場合、代わりに例外がスローされます。 スローされる例外は、 Microsoft.XLANGs.Pipeline.XLANGPipelineManagerException 型です。 この例外は、呼び出し元オーケストレーションの catch ブロックで処理できます。 スローされた例外がオーケストレーションでキャッチされなかった場合は、XLANG エンジンがエラーを報告します。このエラーのテキストには、スローされた例外の情報が含まれています。
この例外は、パイプライン コンポーネントによって生成されたエラー メッセージの書式設定を実行します。
XLANGPipelineManagerException クラスの Message プロパティには、パイプラインの実行エラーの詳細が含まれています。 詳細は次のような形式になっています。
パイプライン <パイプラインの種類を実行中にエラーが発生しました>。 エラーの詳細 <の書式設定されたエラー メッセージ>。
このメッセージでは、 <パイプラインの種類> はパイプライン クラスの名前で、 <書式設定されたエラー メッセージ> はパイプラインの実行中に発生した特定のエラーの説明です。
たとえば、オーケストレーションが受信パイプラインを呼び出し、パイプラインのコンポーネントがメッセージを認識しないためにパイプラインの実行が失敗した場合、 XLANGPipelineManagerException のプロパティの値は次のようになります。
XLANGPipelineManagerException のプロパティ | 値 |
---|---|
Message | 受信パイプラインの実行エラーです "MyPipelines.ReceivePipeline"。 エラーの詳細: "逆アセンブリ ステージ コンポーネントはデータを認識できません。 |
コンポーネント | String.Empty |
別の例として、オーケストレーションが送信パイプラインを呼び出し、検証エラーが発生したためにパイプラインの実行が失敗した場合、XLANGPipelineManagerException の Message プロパティのテキストは次のようになります。
XLANGPipelineManagerException のプロパティ | 値 |
---|---|
Message | 送信パイプライン "MyPipelines.SendPipeline" を実行中にエラーが発生しました。 エラーの詳細: "ドキュメントの検証に失敗しました: " <要素名> 要素が無効です - value <要素の値> は、そのデータ型 'String' に従って無効です - パターン制約は失敗しました。" |
コンポーネント | “Microsoft.BizTalk.Component.XmlValidator” |