spring - Spring Integration DSL 的错误处理中不包含消息 header

标签 spring spring-integration

我正在尝试跟踪所有在每个操作上添加额外 header 的事务,这些额外 header 可以很好地处理请求和响应,但在错误情况下不包含任何 header 。

这是我的配置(使用 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();        
}

我正在为 inboundGateway 使用 errorChannel 并且还使用 mappedReplyHeadersmappedRequestHeaders,是否可以有 header 在 errorChannel 中?有没有办法配置映射的错误 header 或类似的东西?

最佳答案

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

errorChannel 是集成消息传递的一部分,因此根本无法访问 mappedReplyHeaders。把它们忘在这里吧!

从另一边 errorChannel 负责将 Exception 包装到新的 ErrorMessage 中。这就是为什么您不会直接在此处看到 header 的原因。

但您应该记住,在大多数情况下,集成消息传递是具有 failedMessage 属性的 MessagingExceptionfailedMessage 是异常的“有罪”消息。

如果正常的 header 填充过程在任何地方都完成,您可以从 MessagingException payloadfailedMessage 访问您的 header errorChannel 流程中的 ErrorMessage

关于spring - Spring Integration DSL 的错误处理中不包含消息 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36634479/

相关文章:

java - HandlerInterceptor 不适用于匿名

java - 如何在Spring集成中推迟消息的消费

java - Spring集成异步流程

java - 如何使Java ServiceActivator在JUnit Test中可见?

Spring集成异常

java - 测试 Spring Integration 未设置 IntegrationFlows

Spring 4.2.0 - 如何使用 SimpUserRegistry

spring - 迁移现有的 Spring Websocket 处理程序以使用 rsocket

java - Spring Integration 输入文件适配器 - 文件内容应在何处/何时输入消息有效负载?

java - 根据控制代码质量的工具,Spring bean 不是线程安全的