我正在尝试跟踪所有在每个操作上添加额外 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
并且还使用 mappedReplyHeaders
和 mappedRequestHeaders
,是否可以有 header 在 errorChannel
中?有没有办法配置映射的错误 header 或类似的东西?
最佳答案
mappedReplyHeaders
仅在您从下游流收到良好回复时才起作用。它们恰好在将回复消息发送到 AMQP 之前应用。
errorChannel
是集成消息传递的一部分,因此根本无法访问 mappedReplyHeaders
。把它们忘在这里吧!
从另一边 errorChannel
负责将 Exception
包装到新的 ErrorMessage
中。这就是为什么您不会直接在此处看到 header 的原因。
但您应该记住,在大多数情况下,集成消息传递是具有 failedMessage
属性的 MessagingException
。 failedMessage
是异常的“有罪”消息。
如果正常的 header 填充过程在任何地方都完成,您可以从 MessagingException
payload
的 failedMessage
访问您的 header errorChannel
流程中的 ErrorMessage
。
关于spring - Spring Integration DSL 的错误处理中不包含消息 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36634479/