我正在尝试跟踪在每个操作上添加额外标头的所有事务,这些额外的标头可以正常处理请求和响应,但在错误情况下没有包含标头。
这是我的配置(使用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
并使用mappedReplyHeaders
和mappedRequestHeaders
,是否可以在errorChannel
中添加标题?有一种方法可以配置映射的错误标题或类似的东西吗?
答案 0 :(得分:1)
mappedReplyHeaders
仅在您收到下游流程的良好回复时才起作用。它们在将回复消息发送到AMQP之前准确应用。
errorChannel
是集成消息传递的一部分,因此根本无法访问mappedReplyHeaders
。忘记他们了!
errorChannel
从另一方负责将Exception
包装到新的ErrorMessage
中。这就是为什么你不直接在那里看到你的标题。
但是您应该记住,在大多数情况下,集成消息传递的MessagingException
属性为failedMessage
。那个failedMessage
是一个有罪的"异常消息。
如果正常的标头填充过程在任何地方完成,您可以通过failedMessage
MessagingException
payload
ErrorMessage
的{{1}}访问您的标头{1}}流动。