2016-04-14 8 views
2

各トランザクションで余分なヘッダを追加するすべてのトランザクションを追跡しようとしていますが、これらの余分なヘッダは要求と応答でうまく動作しますが、Spring Integration DSLでのエラー処理にメッセージヘッダが含まれていない

これは私がinboundGatewayためerrorChannelを使用してもmappedReplyHeadersmappedRequestHeadersを使用しています(春の統合DSLとJava 1.7で)私の設定

@Bean 
public IntegrationFlow inboundFlow() { 
    return IntegrationFlows.from(Amqp.inboundGateway(simpleMessageListenerContainer()) 
     .mappedReplyHeaders(AMQPConstants.AMQP_CUSTOM_HEADER_FIELD_NAME_MATCH_PATTERN) 
     .mappedRequestHeaders(AMQPConstants.AMQP_CUSTOM_HEADER_FIELD_NAME_MATCH_PATTERN) 
     .errorChannel(gatewayErrorChannel()) 
     .requestChannel(gatewayRequestChannel()) 
     .replyChannel(gatewayResponseChannel()) 
    ) 
    .transform(getCustomFromJsonTransformer()) 
    .route(new HeaderValueRouter(AMQPConstants.OPERATION_ROUTING_KEY)) 
    .get(); 
} 

@Bean 
public MessageChannel gatewayRequestChannel() { 
    return MessageChannels.direct().get(); 
} 

@Bean 
public MessageChannel gatewayResponseChannel() { 
    return MessageChannels.publishSubscribe().get(); 
} 

@Bean 
public MessageChannel gatewayErrorChannel() { 
    return MessageChannels.publishSubscribe().get(); 
} 

@Bean  
public IntegrationFlow responseTrackerOutboundFlow() {  
    return trackerOutboundFlowTemplate(gatewayResponseChannel());  
} 

@Bean  
public IntegrationFlow errorTrackerOutboundFlow() {  
    return trackerOutboundFlowTemplate(gatewayErrorChannel());  
} 

private IntegrationFlow trackerOutboundFlowTemplate(MessageChannel fromMessageChannel) {   
    return IntegrationFlows.from(fromMessageChannel)   
     .handle(Amqp.outboundAdapter(new RabbitTemplate(getConnectionFactory())) 
       .exchangeName(LOGGER_EXCHANGE_NAME) 
       .routingKey(LOGGER_EXCHANGE_ROUTING_KEY) 
       .mappedRequestHeaders("*"))  
     .get();   
} 

あり、それはerrorChannelのヘッダーを持つことは可能でしょうか?マップされたエラーヘッダーなどを設定する方法はありますか?

答えて

1

mappedReplyHeadersは、ダウンストリームフローから良好な応答を受け取った場合にのみ機能します。それらは、応答メッセージをAMQPに送信する前に正確に適用されます。

errorChannelは統合メッセージングの一部であるため、mappedReplyHeadersには全くアクセスできません。ここを忘れて!

errorChannelは、Exceptionを新しいErrorMessageにラップする責任があります。そのため、そこにヘッダーが直接表示されません。

ほとんどの場合、統合メッセージングは​​MessagingExceptionで、failedMessageプロパティを使用していることに注意してください。そのfailedMessageは、例外に対する「有罪」のメッセージです。

、通常のヘッダ人口プロセスがどこでも行われている場合、あなたはerrorChannelフローのErrorMessageMessagingException​​のこのfailedMessageからあなたのヘッダーへのアクセスを得ることができます。

+0

ありがとう、それは働いた! – jcastaneyra

関連する問題