次の方法で共有


式を使用してパイプラインを実行する方法

BizTalk Server には、オーケストレーション内からパイプラインを同期的に呼び出す機能があります。 これにより、オーケストレーションは、メッセージング インフラストラクチャを介してそのデータを送信することなく、データ本文に対してパイプライン内にカプセル化されたメッセージ処理 (送信または受信) を利用できます。

この機能を使用すると、オーケストレーションで送信パイプラインを呼び出し、複数のメッセージを 1 つの送信インターチェンジに集約できます。 逆に、オーケストレーションは受信パイプラインを呼び出して、メッセージ ボックスを通過する処理コストを発生させることなく、メッセージング インフラストラクチャの外部で取得したインターチェンジをデコードおよび逆アセンブルできます。

詳細

オーケストレーションでは、 XLANGPipelineManager クラス ( Microsoft.XLANGs.Pipeline 名前空間内) のメソッドを使用して、送信パイプラインまたは受信パイプラインを呼び出します。 受信パイプラインは、BizTalk メッセージング内でメッセージを受信するコンテキストでパイプラインが実行される場合と同様に、1 つのメッセージまたはインターチェンジのいずれかを使用し、0 個以上のメッセージを生成します。 送信パイプラインは、BizTalk メッセージング内でメッセージを送信するコンテキストでパイプラインが実行される場合と同様に、1 つ以上のメッセージを消費し、1 つのメッセージまたはインターチェンジを生成します。

受信パイプラインの呼び出し

オーケストレーション内から受信パイプラインを呼び出すために、アプリケーションは XLANGPipelineManager クラスの ExecuteReceivePipeline() メソッドを呼び出します。 このメソッドは、1 つのインターチェンジを使用し、0 個以上のメッセージのコレクションを返します ( ReceivePipelineOutputMessages クラスのインスタンスに含まれます)。 このメソッドの構文の詳細については、 XLANGPipelineManager クラスの .NET クラス ライブラリ リファレンスを参照してください。

オーケストレーション内から受信パイプラインを実行するための API は次のとおりです。

// Execute receive pipeline

static public ReceivePipelineOutputMessages ExecuteReceivePipeline(System.Type receivePipelineType, XLANGMessage msg);

通常、受信パイプラインの呼び出しは、オーケストレーション内の Expression 形状で行われます。

オーケストレーション内から受信パイプラインを呼び出すには、開発者がオーケストレーション プロジェクト内のパイプライン アセンブリを参照する必要があります。 受信パイプラインを呼び出すオーケストレーションの例を次に示します。

受信パイプラインの呼び出し画面

詳細な例については、SDK サンプル 構成済みメッセージ プロセッサ (BizTalk Server サンプル) を参照してください。

ReceivePipelineOutputMessages 型の変数は、オーケストレーション内のアトミック スコープ内でのみ宣言できます。 これは、この型の変数はシリアル化できないため、オーケストレーションの永続化に耐えられず、アトミック スコープ内で実行中にオーケストレーションが永続化されることはありません。 つまり、受信パイプラインはアトミック スコープ内でのみ実行できます。

オーケストレーション内から PassThruReceive パイプラインまたはカスタム パイプライン コンポーネントを呼び出す場合、受信メッセージの種類が XML かどうかに関わらず、受信メッセージの変数型を System.Xml.XmlDocument として宣言する必要があります。 したがって、受信メッセージがフラット ファイル形式メッセージなどの 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);

送信パイプラインの呼び出しは、オーケストレーション内の メッセージ割り当て 図形で行う必要があります。

オーケストレーション内から送信パイプラインを呼び出すには、開発者がオーケストレーション プロジェクト内のパイプライン アセンブリを参照する必要があります。 送信パイプラインを呼び出すオーケストレーションの例:

[送信パイプラインの呼び出し] 画面

既定の 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 v1.1

  • .NET Framework v2.0

  • .NET Framework v3.0

  • .NET Framework v3.5

  • .NET Framework v4.0

  • .NET Framework v2.0

  • COM

制約

次の種類のパイプラインは オーケストレーション内から実行できません。

  • トランザクション パイプライン

  • 回復可能なパイプライン

  • BAM インターセプター API を呼び出すパイプライン (NotSupportedException が発生します)。

  • 並列図形の異なる分岐で同じパイプライン インスタンスを実行することはできません。ただし、すべての分岐の同期スコープに配置されている場合を除きます。

  • BizTalk Server 2006 SDK に対してビルドされた既存のパイプライン (アセンブリ)。

障害モードと影響

中断されたメッセージが発生した可能性のあるパイプラインの実行でエラーが発生した場合、このパイプラインが BizTalk Server メッセージング インフラストラクチャ内から呼び出されると、代わりに例外がスローされます。 スローされる例外は、 Microsoft.XLANGs.Pipeline.XLANGPipelineManagerException 型です。 このスローされた例外は、呼び出し元オーケストレーション内の catch ブロックで処理できます。 オーケストレーションがスローされた例外をキャッチしない場合、XLANGs エンジンは、スローされた例外に例外情報を含むテキストをエラーとして報告します。

例外は、パイプライン コンポーネントによって生成されたエラー メッセージの書式設定を実行します。

XLANGPipelineManagerException クラスの Message プロパティには、パイプラインの実行エラーの詳細が含まれています。 この詳細は次の形式です。

  • パイプライン <パイプラインの種類>を実行中にエラーが発生しました。 エラーの詳細 <書式設定されたエラー メッセージ>。

    このメッセージでは、 <パイプラインの種類> はパイプライン クラスの名前であり <形式が設定されたエラー メッセージです> パイプラインの実行中に発生した特定のエラーの説明です。

    たとえば、オーケストレーションが受信パイプラインを呼び出し、パイプラインのコンポーネントがメッセージを認識しないためにパイプラインの実行が失敗した場合、 XLANGPipelineManagerException のプロパティの値は次のようになります。

XLANGPipelineManagerException プロパティ 価値
メッセージ 受信パイプライン "MyPipelines.ReceivePipeline" を実行中にエラーが発生しました。 エラーの詳細: "逆アセンブル ステージ コンポーネントはデータを認識できません。
コンポーネント 空の文字列

別の例として、オーケストレーションが送信パイプラインを呼び出し、検証エラーが発生したためにパイプラインの実行が失敗した場合、XLANGPipelineManagerExceptionMessage プロパティのテキストは次のようになります。

XLANGPipelineManagerException プロパティ 価値
メッセージ 送信パイプライン "MyPipelines.SendPipeline" を実行中にエラーが発生しました。 エラーの詳細: "ドキュメントの検証に失敗しました: " <要素名> 要素が無効です - 値 <element 値> は、そのデータ型 'String' に従って無効です - パターン制約に失敗しました。"
コンポーネント "Microsoft.BizTalk.Component.XmlValidator"