Spring Integration DSL的错误处理中不包含消息头

时间:2016-04-14 21:38:37

标签: spring spring-integration

我正在尝试跟踪在每个操作上添加额外标头的所有事务,这些额外的标头可以正常处理请求和响应,但在错误情况下没有包含标头。

这是我的配置(使用Spring Integration 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使用inboundGateway并使用mappedReplyHeadersmappedRequestHeaders,是否可以在errorChannel中添加标题?有一种方法可以配置映射的错误标题或类似的东西吗?

1 个答案:

答案 0 :(得分:1)

mappedReplyHeaders仅在您收到下游流程的良好回复时才起作用。它们在将回复消息发送到AMQP之前准确应用。

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

errorChannel从另一方负责将Exception包装到新的ErrorMessage中。这就是为什么你不直接在那里看到你的标题。

但是您应该记住,在大多数情况下,集成消息传递的MessagingException属性为failedMessage。那个failedMessage是一个有罪的"异常消息。

如果正常的标头填充过程在任何地方完成,您可以通过failedMessage MessagingException payload ErrorMessage的{​​{1}}访问您的标头{1}}流动。