呼び出されたオーケストレーションに受信サブスクリプションを作成する方法

オーケストレーションを開始するときに、オーケストレーションの 開始 図形を介してパラメーターとしてメッセージを渡すことができますが、一部のシナリオでは、呼び出し元オーケストレーションから呼び出し後に呼び出されたオーケストレーションにメッセージを送信できます。 たとえば、渡すべきメッセージが呼び出しの時点で判明していない場合や、呼び出されたオーケストレーションに他のオーケストレーションから動的にメッセージを送信する場合などです。

呼び出し先オーケストレーションにメッセージを送信するには、関連付けを渡します。呼び出し先オーケストレーションはこの関連付けに基づいてサブスクリプションを作成し、さらにそのサブスクリプションを使用してメッセージを受信します。 ただし、呼び出し先オーケストレーションに関連付けを渡すだけでは、関連付けに基づくサブスクリプションは作成されず、サブスクリプションのメッセージも受信されません。 この方法を使用した場合、呼び出し元オーケストレーションから呼び出し先オーケストレーションにメッセージを送信すると、"サブスクライバーが見つからなかったので、パブリッシュされたメッセージをルーティングできませんでした。" というエラーが発生します。原因は次のとおりです。

  • 呼び出し先のオーケストレーションに競合状態が存在する

  • 呼び出し先オーケストレーションがメッセージ ボックス データベースへサブスクリプションを送信するためのコミット ポイントが存在しないので、ルーティングされたメッセージを受け取ることができない。

    この問題を解決する方法は、次の手順を実行することです。

  1. 呼び出し先オーケストレーションで、メッセージを受信するアクティブ化受信を作成します。 呼び出し元オーケストレーションでメッセージを受信したら、関連付けセットを初期化し、関連付けセットと自己相関受信ダイレクト バインド ポートを [オーケストレーションの開始 ] 図形を介して渡します。 渡したポートが、呼び出し先オーケストレーションの送信ポートになります。このポートを使用してメッセージを返し、呼び出し元オーケストレーションと同期します。

  2. 呼び出し先オーケストレーションで、自己関連付けポートを通じて、呼び出し元オーケストレーションにメッセージを返します。 これで呼び出し元オーケストレーションと同期をとれるので、競合状態を回避し、コミット ポイントを設けることができます。また、呼び出し先オーケストレーションでは、メッセージ ボックスへの受信サブスクリプションを作成し、メッセージがルーティングされるようにします。

  3. 呼び出し元オーケストレーションは、自己関連付けポートを通じてメッセージを受信し、呼び出し先オーケストレーションと同期します。 自己関連付けポートの受信には、フォロー関連付けが必要ありません。 これで、呼び出し元オーケストレーションからのメッセージを、呼び出し先オーケストレーションへ安全に送信できるようになりました。呼び出し先オーケストレーションは、関連付けに基づいてメッセージを受信します。

    前の方法でも目的を達成できますが、より良い方法として、受信に使用する関連付けを初期化するメッセージを渡す方法があります。 自己関連付けポートを通じて、呼び出し元オーケストレーションと呼び出し先オーケストレーションを同期するときは、関連付けの初期化に必要なメッセージを渡すことをお勧めします。 次の手順は、信頼性とパフォーマンスが最も高い方法です。

  4. 呼び出し先オーケストレーションで、メッセージを受信するアクティブ化受信を作成します。 メッセージを受信したら、メッセージと自己相関受信ダイレクト バインド ポートを [オーケストレーションの開始] 図形を介して渡します。 呼び出し先オーケストレーションでは、ここで渡したメッセージを使用して関連付けが初期化されます。 渡したポートが、呼び出し先オーケストレーションの送信ポートになります。このポートを使用してメッセージを返し、呼び出し元オーケストレーションと同期します。

  5. 呼び出し先オーケストレーションでは、関連付けを初期化して、呼び出し元オーケストレーションにメッセージを返します。 これで呼び出し元オーケストレーションと同期をとれるので、競合状態を回避し、コミット ポイントを設けることができます。また、呼び出し先オーケストレーションでは、メッセージ ボックスへの受信サブスクリプションを作成し、メッセージがルーティングされるようにします。

  6. 呼び出し元オーケストレーションは、自己関連付けポートを通じてメッセージを受信し、呼び出し先オーケストレーションと同期します。 自己相関ポート受信では、相関フォロワーは必要ありません。 これで、呼び出し元オーケストレーションからのメッセージを、呼び出し先オーケストレーションへ安全に送信できるようになりました。呼び出し先オーケストレーションは、関連付けに基づいてメッセージを受信します。

参照

オーケストレーションでの関連付けの使用
自己関連付けを行う直接バインド ポートの使用方法