2016-04-14 64 views
2

我试图跟踪所有在每个操作上添加额外标题的事务,这些额外的标头可以很好地处理请求和响应,但是在错误情况下没有包含标题。消息标题不包含在使用Spring集成DSL的错误处理中

这是我的配置(与Spring集成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();   
} 

我使用errorChannelinboundGateway并且还使用mappedReplyHeadersmappedRequestHeaders,是有可能有头在errorChannel?有一种方法来配置映射错误标题或类似的东西?

回答

1

mappedReplyHeaders只有在收到来自下游流的良好回复时才有效。它们在将答复消息发送给AMQP之前就被应用。

errorChannel是集成消息传递的一部分,因此完全无法访问mappedReplyHeaders。忘记他们吧!

从另一端errorChannel负责将Exception换成新的ErrorMessage。这就是为什么你没有直接看到你的标题。

但是,您应该记住,在大多数情况下集成消息传递是MessagingExceptionfailedMessage属性。 failedMessage是一个例外的“有罪”信息。

如果正常的头填充过程完成处处,你可以在errorChannel流程从此failedMessageMessagingException​​的ErrorMessage的访问你的头。

+0

非常感谢,它的工作! – jcastaneyra