私はSpring Integrationを使用してSOAPリクエストを送信し、SOAPレスポンスを受信して処理しています。これは何私であるSpring統合:現在のペイロードを使用したクレームチェックでオブジェクトを更新する方法
public class ExchangeMessage {
protected String request;
protected String response;
...
:私はまた、オブジェクトでは、オリジナルのSOAPリクエストとレスポンスを保存するために、次のようになりますExchangeMessageと呼ばれる簡単なPOJOを、クレームチェックパターンを使用して(または使用しようとして)います
(1) <int:transformer input-channel="transformerChannel" output-channel="requestChannel"/>
(2) <int:gateway default-request-channel="transformerChannel" />
<int:chain input-channel="requestChannel" output-channel="loggerChannel">
(3) <int:service-activator ref="exchangeMessageServiceActivator" />
(4) <int:claim-check-in/>
(5) <int:claim-check-out/>
(6) <int:transformer expression="payload.getRequest()" />
(7) <ws:outbound-gateway uri="http://.../>
(8) <int:transformer ref="xmlMsgToPojoTransformer" />
... processing ...
</int:chain>
基本的には、(1)及び(2)私は、インバウンドゲートウェイへの単純なPOJOを送るには、それは簡単なSOAPリクエスト(文字列)に変換されます。流れは現在のように見えます。
(3)で、exchangeMessageServiceActivator BeanはStringを受け入れ、ExchangeMessageオブジェクトを作成し、SOAP要求でsetRequest()メソッドを呼び出します。
In(4)新しく作成したExchangeMessageをクレームチェックに保存します。
(5)で、私はそれをチェックアウトし、(6)と(7)でExchangeMessage.getRequest()の内容をWS Outbound Gatewayに送信します。とにかくExchangeMessageオブジェクトを保存したいので、クレームチェックインの直後にクレームチェックアウトを呼び出しても、ほとんど同じことだと思いました醜い。
問題は、(7)と(8)の間で始まります。 (7)のペイロードはSOAP応答です。 をObjectにアンマーシャリングしてから処理する前に、< claim-check-out>を使用してExchangeMessageを取得し、SOAP Responseを使用してExchangeMessage.setResponse()メソッドを呼び出し、を処理のためにSOAPレスポンスをオブジェクトに変換します。
問題は、(7)と(8)の間に私が<クレームチェックアウト>を付けると、私は(7)の元のペイロード、SOAP応答を失うことです。
私は、(7)と(8)の間にある種のサービスアクティベータを使用して、クレームチェックからExchangeMessageをロードし、(7)のペイロードを使用してsetResponse私はそれを行う方法を理解することはできません。このサービスアクティベーターのペイロードは、メッセージが、私は(をClaimCheckOutTransformer.transformする方法に渡す必要があることから来ない文字列(SOAPレスポンス)になる場合)
SimpleMessageStore simpleMessageStore = (SimpleMessageStore)context.getBean("simpleMessageStore");
ClaimCheckOutTransformer claimCheckOutTransformer = new ClaimCheckOutTransformer(simpleMessageStore);
claimCheckOutTransformer.transform(Message???);
:私はここまで得ていますか?
私はSpring Integrationが大好きです。しかし、これは私に困ってしまった。
Hmmm ...ただし、次のダウンストリームコンシューマのみが使用できるヘッダーではありませんか?言い換えれば、ExchangeMessageをステップ(3)の後にヘッダに入れ、発信ゲートウェイを呼び出す(それを呼び出す(4))が、ステップ(5)で利用可能になるかどうか、例えばExchangeMessageまたは、各ステップでヘッダーを手動で追加する必要がありますか?これは、以前のようなものを試してみました。Header Enricherが追加したときから、ヘッダー2または3のコンシューマー下流にアクセスしようとしました。ヘッダーが存在しないと言っています... –
ヘッダーは各ダウンストリームメッセージに保持されますが、唯一の例外はペイロードの代わりに 'Message >'型を返すカスタムトランスフォーマーがある場合ですトランスフォーマーはヘッダーも操作したい);この場合、フレームワークはカスタムトランスフォーマーが保持したいヘッダーを伝播させることを前提としており、通常はメッセージビルダーの 'copyHeaders()'メソッドを使用します。 –
うわー、どうもありがとう!それはまさに私がSIドキュメントで探していた情報です - ヘッダーはどれくらい長く生きていますか?私は起こっていたことが、私が変圧器の後のヘッダー*にアクセスしようとしていたに違いないと思うので、もはや存在しませんでした。ヘッダーで遊んだ後、私は、それぞれのメッセージに対してシリアル化と逆シリアル化を行う必要がないので、クレームチェックを使用する方がクリーンであるという結論に達しました。しかし、私のユースケースは、クレームチェック*と*現在のペイロードに保存されているデータを同時に使用することはあまりにも複雑すぎるようです。再度、感謝します! –