2016-04-14 5 views
1

非常に基本的なものである春の統合フローを通過するすべてのメッセージを監査する必要があります。Purpousesを監査するためのMessageHistoryオブジェクトのオーバーロード

アプリケーションは、int-redis:queue-inbound-channel-adapterから読み取り、int-http:outbound-gatewayに書き込みます。

出力ゲートウェイには、HTTPメソッドの応答を受け取るための返信チャネルがあります。これは、最初のメッセージとhttp応答を含む監査情報を登録したいときです。

httpメソッドが失敗した場合、メッセージはerrorHandlerに送られ、タイムスタンプとペイロードで履歴オブジェクトを取得できます。これは監査に最適です。

httpメソッドが動作する場合(Code 200,201 ...)、ステータスコード付きのResponseEntityオブジェクトを含むメッセージが表示されますが、redisの初期ペイロードはありません。

したがって、監査のための完全な情報を得るために、2つのメッセージを統合する方法はありますか(http発信とhttp応答を送信する前に)

ありがとうございます!

ここで統合の流れ:

<int:message-history/> 

<int:channel id="responseChannel"/> 

<int:channel id="responseError"/> 

<int:logging-channel-adapter channel="responseChannel" level="INFO" 
    expression="@messageHandlerSpel.handle(#this)" id="logger"/> 

<int:logging-channel-adapter channel="responseError" 
    level="ERROR" expression="@errorHandlerSpel.handle(#this)" 
    id="LogingERROR"/> 

<int-redis:queue-inbound-channel-adapter id="inputRedis" connection-factory="redisCF" 
    channel="redisInput" queue="redis-input" serializer="" error-channel="responseError"/> 

<int:channel id="redisInput" /> 

<int-http:outbound-gateway id="HttpOutbound" request-channel="redisInput" 
    url="http://{server}:{port}/{index}/{type}/{id}" 
    http-method="PUT" extract-request-payload="true" charset="UTF-8" 
    reply-channel="responseChannel" request-factory="requestFactory"/> 

およびハンドラクラス:

@Component 
public class MessageHandlerSpel { 
    public String handle(Message<byte[]> message) { 
     MessageHeaders msgH = message.getHeaders(); 
     MessageHistory msgHistory = 
      message.getHeaders().get(MessageHistory.HEADER_NAME, MessageHistory.class); 
     ... // Do whatever 
    return ""; 
} 

答えて

0

1つのトリックは、HTTPリクエストを実行する前に、カスタムヘッダ内の要求​​を格納することです。

応答を受信した後、要求ヘッダーはその応答​​とマージされます。したがって、下流にはヘッダーの要求と​​の応答の両方があります。

MessageHistoryは同じで、何とかそこにハックする理由はありません。

別のアプローチは、要求と応答を関連付けるために<aggregator>に基づいています。しかし、これはより複雑で分散したシナリオのためのものです。

単純なコピー/経由ヘッダに貼り付けます。

<header-enricher> 
    <header name="requestPayload" expressio="payload"/> 
</header-enricher> 

はあなたのための十分なはずです。

+0

Perfectaとクリーンなソリューション、Thanks Artem! –

関連する問題