旅程でのオーケストレーションの後に発生するBREで変換サービスを解決する方法は?
-
24-10-2019 - |
質問
簡単な統合を実装しようとする際 パターン BizTalk ESB Toolkit 2.0では、オーケストレーション後に発生する変換の旅程サービスを解決しようとする問題に直面しています。
BRE Resolverを使用して、コンテキストメッセージタイププロパティを検査する必要があるルールを実行して、使用する適切なマップを決定します。ただし、メッセージが変換サービスに関連付けられた旅程のステップに到達すると、マップは実行できません。
慎重な調査から、メッセージタイプは、BREリゾルバーによって内部で使用される「解像度」オブジェクトに提供されていないようです。確かに、前のオーケストレーションを離れるメッセージが入力されているので System.Xml.XmlDocument
, 、メッセージのタイプは、コンテキストから「降格」されます。
ルールを追跡することにより、エンジンの実行を実行することで、メッセージのタイプが確かにあることを観察できます 失った BREリゾルバーに到達するとき。メッセージのタイプは空ですが、ドキュメントの強いタイプは Microsoft.XLANGs.BaseTypes.Any
.
私が使用するオーケストレーションサービスは、ESB Toolkit 2.0を使用して出荷するサンプルから直接取得されます。
コンテキストベースのBRE解像度を実行する方法はありますか 後 旅程のオーケストレーション?
解決
私自身の質問に答える...要するに、重要なのは、元のメッセージのコンテキストをPreverseし、MessageTypeコンテキストプロパティを促進することです。次の段落で、私は今後の投稿を再現します 私のブログ:
オーケストレーションの旅程サービス101
この仕事をするのに苦労し、さまざまな解決策を試みた後、私はついに従うべき一連の簡単なルールで成功しました。この投稿では、旅程サービスとして使用でき、メッセージのコンテキストタイプに基づいて動的変換のためのビジネスルールエンジンリゾルバーを利用できる、行儀の良いESBツールキット2.0フレンドリーオーケストレーションを構成するものを概説したいと思います。 。
旅程サービスのコンテキストサブスクリプション
まず、旅程サービスとして使用するように設計されたオーケストレーションには、ESBに優しいサブスクリプションを定義する受信形状にリンクする直接的な論理ポートが必要です。
Microsoft.Practices.ESB.Itinerary.Schemas.ServiceName == "MyCustomItineraryService" And
Microsoft.Practices.ESB.Itinerary.Schemas.ServiceState == "Pending" And
Microsoft.Practices.ESB.Itinerary.Schemas.ServiceType == "Orchestration"
ドキュメントではこれには言及されていませんが、これにより、直接的なポート操作を型system.xml.xmldocumentのメッセージにマッピングする必要があることが明らかになります。確かに、そうでない場合、オーケストレーションは実行されず、 ルーティングの失敗 エラーメッセージはに登録されます メッセージボックス.
ちなみに、これはそのことを意味します メッセージのタイプ まったく考慮されていません。そして、これは主に、オーケストレーションの実行後、ビジネスルールエンジンリゾルバーが正しい変換を決定できない理由を主に説明しています。
旅程で取得
オーケストレーションの開始時に式形状の次のコードは、現在の旅程のステップを取得するのに役立ちます。
// Retrieve the current itinerary step.
itinerary.Itinerary = Microsoft.Practices.ESB.Itinerary.ItineraryOMFactory.Create(InboundMessage);
itineraryStep.ItineraryStep = itinerary.Itinerary.GetItineraryStep(InboundMessage);
元のメッセージのコンテキストを保存します
次に、元のメッセージのコンテキストは、オーケストレーションの各ステップで(ほとんどの場合)保存する必要があります。これは、手元の特定のシナリオを実行するためにオーケストレーションにいくつかの中間構造形状を持つ場合に特に重要です。
OutboundMessage(*) = SourceMessage(*)
上記の文で「大部分」と書いたことに注意してください。実際、すぐにわかるように、結果のメッセージのタイプは、オーケストレーションの最後にコンテキストに存在する必要があります。おそらく、これはaになります 別のタイプ 元のインバウンドメッセージよりも。そして、読み取り専用に割り当てられてから bts.messagetype プロパティは不可能です。これは時々達成するのが非常に難しい場合があります。
オーケストレーションまたは他のエキゾチックなテクニック内でカスタムパイプラインを実行するには、これが当てはまるようにする必要があるかもしれません。ただし、ほとんどの場合、上記の構文は機能するはずです。
旅程を進めます
以下の非常に簡単なコードは、オーケストレーションの終わりに忘れてはなりません。
itinerary.Itinerary.Advance(OutboundMessage, itineraryStep.ItineraryStep);
コンテキストプロパティの促進
ドキュメンテーション 正確な手順に従う必要がある場合、またはそのようなオーケストレーションからプロパティを宣伝する必要がある場合でも、まったく明確に説明しませんが、ソースコードとして提供されるサンプルを見ると、次のプロパティが解像度メカニズムに参加することがわかります。
ただし、この投稿で概説されているシナリオでは、これは間違いなく十分ではありません。
オーケストレーション後にコンテキストベースのルールが機能するには、BTS.MessageTypeプロパティも促進する必要があります。これは、オーケストレーションの最後に送信形状の相関を初期化することで簡単に実現できます。
そして、それは機能します!
結果のメッセージのコンテキストでメッセージタイプを宣伝することは、私の元の試みで欠落していたものでした。これが特定されると、旅程は魅力のように機能しました!
事実の後に解決策は明白に思えるかもしれませんが、以前にそれを知っていたなら、それは確かに私を助けてくれたでしょう。この投稿が同じ問題にぶつかるのに役立つことを願っています。