0

これまでの話

応答(たとえばResponse_A)を<all>フローに送信するSOAPサービスがあります。フロー内には、Response_Aから入力を受け取る3つのSOAPサービス(B、C、Dなど)があります。Response_Aからフィールドを取得し、XSLTを使用して、B、C、およびDの要求を作成できます。

簡単な質問:メッセージを並列処理するために<all>内の<async>ブロックを使用しています。内部で<all>タグと<processor-chain>タグを使用する場合、処理は並列ではありませんでした。なぜ何かアイデアはありますか?

ロードマップ

3つのB、C、およびDのすべてからの応答を読み取り、それらを1つの応答に結合して(おそらくXSLTを再度使用して)、Eに送信します。

障害物

<all>フローから出た後、MuleMessageCollectionを取得します。それを読み、メッセージを1つのメッセージに結合する方法は?

私の試み

相関IDに基づいてメッセージを集約しようとしましたが、相関IDが存在するのは、Aからのメッセージが<all>タグによって分割され、B、C、およびDに送信された場合のみであることに気付きました。相関IDは、enableMuleSoapHeadersをtrueに設定した場合でも、これらのサービスからの応答として提供されるSOAPエンベロープ。サービスを変更できません。したがって、SOAP応答に相関IDを表示するにはどうすればよいですか(メッセージをマージする場合に相関IDが絶対に必要な場合)

メッセージを集約するためのグループサイズも必要になると思います。

メッセージプロパティトランスフォーマーを使用して相関IDを追加しようとしましたが、そのようには機能しませんでした。私はMessageCollectionで立ち往生していて、その中に相関IDを持つメッセージがあったとしても、それを読み取る方法がわかりませんでした。

つまり、1つの質問に要約されます。MessageCollectionからのメッセージをマージする方法は何ですか?

Javaでカスタムトランスフォーマーを作成せずに、xmlでこれを実行したいと思います。出来ますか?私のアプローチはどうあるべきですか?

:B、C、およびDからの応答メッセージのDOM構造は異なります。作成したいマージされたメッセージは、A、B、C、およびDのすべての応答および要求とは異なるDOを持っています。

それが役に立ったら、私はここで説明されているのと同様の状況で作業しようとしています:http ://ricston.com/blog/?p=640唯一の違いは、フローとallタグを使用していることです。

4

1 に答える 1

0

とタグを使用する場合、処理は並列ではありませんでした。なぜ何かアイデアはありますか?

これは、すべてプロセッサチェーンが本質的に同期しているためです。これらは何も並列化しません。

ここで、リモート非同期応答の集約の問題について、リモートサービスがMuleヘッダーを反映しない場合(これは、Muleを使用しないサービスの大部分に当てはまります)、多分使用できるかどうかを確認する必要があります。リモートサービスから反映される応答ペイロード内の値(SOAPヘッダーまたはSOAP本体内のIDなどのフィールドである可能性があります)。その場合は、Muleヘッダーではなく別のソースを使用して相関が行われることを指定するexpression-message-info-mappingを使用してcollection-aggregatorを構成できます。

それ以外の場合は、すべてのブロックを保持して、次々に呼び出しを行うことをお勧めします...

于 2012-04-19T15:50:14.950 に答える