2016-12-12 4 views
0

私はSpring Integrationを使用してSOAPリクエストを送信し、SOAPレスポンスを受信して​​処理しています。これは何私であるSpring統合:現在のペイロードを使用したクレームチェックでオブジェクトを更新する方法

public class ExchangeMessage { 

    protected String request; 
    protected String response; 
    ... 

:私はまた、オブジェクトでは、オリジナルのSOAPリクエストとレスポンスを保存するために、次のようになりますExchangeMes​​sageと呼ばれる簡単な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)で、exchangeMes​​sageServiceActivator BeanはStringを受け入れ、ExchangeMes​​sageオブジェクトを作成し、SOAP要求でsetRequest()メソッドを呼び出します。

In(4)新しく作成したExchangeMes​​sageをクレームチェックに保存します。

(5)で、私はそれをチェックアウトし、(6)と(7)でExchangeMes​​sage.getRequest()の内容をWS Outbound Gatewayに送信します。とにかくExchangeMes​​sageオブジェクトを保存したいので、クレームチェックインの直後にクレームチェックアウトを呼び出しても、ほとんど同じことだと思いました醜い。

問題は、(7)と(8)の間で始まります。 (7)のペイロードはSOAP応答です。 をObjectにアンマーシャリングしてから処理する前に、< claim-check-out>を使用してExchangeMes​​sageを取得し、SOAP Responseを使用してExchangeMes​​sage.setResponse()メソッドを呼び出し、処理のためにSOAPレスポンスをオブジェクトに変換します。

問題は、(7)と(8)の間に私が<クレームチェックアウト>を付けると、私は(7)の元のペイロード、SOAP応答を失うことです。

私は、(7)と(8)の間にある種のサービスアクティベータを使用して、クレームチェックからExchangeMes​​sageをロードし、(7)のペイロードを使用してsetResponse私はそれを行う方法を理解することはできません。このサービスアクティベーターのペイロードは、メッセージが、私は(をClaimCheckOutTransformer.transformする方法に渡す必要があることから来ない文字列(SOAPレスポンス)になる場合)

SimpleMessageStore simpleMessageStore = (SimpleMessageStore)context.getBean("simpleMessageStore"); 
ClaimCheckOutTransformer claimCheckOutTransformer = new ClaimCheckOutTransformer(simpleMessageStore); 
claimCheckOutTransformer.transform(Message???); 

:私はここまで得ていますか?

私はSpring Integrationが大好きです。しかし、これは私に困ってしまった。

答えて

0

クレームチェックを使用する代わりに、ヘッダーエンリッチャーを使用してExchangeMessageをヘッダーに保存する方が簡単です。

このようにして、後でsetResponse()を呼び出すことができます。

それ以外の場合は、クレームチェックのペイロード(4〜5の間)と応答を再度保存する必要がありますが、元のオブジェクトを保存せずにクレームチェック。

+0

Hmmm ...ただし、次のダウンストリームコンシューマのみが使用できるヘッダーではありませんか?言い換えれば、ExchangeMes​​sageをステップ(3)の後にヘッダに入れ、発信ゲートウェイを呼び出す(それを呼び出す(4))が、ステップ(5)で利用可能になるかどうか、例えばExchangeMes​​sageまたは、各ステップでヘッダーを手動で追加する必要がありますか?これは、以前のようなものを試してみました。Header Enricherが追加したときから、ヘッダー2または3のコンシューマー下流にアクセスしようとしました。ヘッダーが存在しないと言っています... –

+0

ヘッダーは各ダウンストリームメッセージに保持されますが、唯一の例外はペイロードの代わりに 'Message '型を返すカスタムトランスフォーマーがある場合ですトランスフォーマーはヘッダーも操作したい);この場合、フレームワークはカスタムトランスフォーマーが保持したいヘッダーを伝播させることを前提としており、通常はメッセージビルダーの 'copyHeaders()'メソッドを使用します。 –

+0

うわー、どうもありがとう!それはまさに私がSIドキュメントで探していた情報です - ヘッダーはどれくらい長く生きていますか?私は起こっていたことが、私が変圧器の後のヘッダー*にアクセスしようとしていたに違いないと思うので、もはや存在しませんでした。ヘッダーで遊んだ後、私は、それぞれのメッセージに対してシリアル化と逆シリアル化を行う必要がないので、クレームチェックを使用する方がクリーンであるという結論に達しました。しかし、私のユースケースは、クレームチェック*と*現在のペイロードに保存されているデータを同時に使用することはあまりにも複雑すぎるようです。再度、感謝します! –

関連する問題