嘿,我正在向http端点发送消息,因为我必须在选择性故障时触发错误流,我将通过网关发送消息,然后通过http出站网关进行路由。
@MessagingGateway(errorChannel="invocationFailureChannel")
public interface Invocator {
@Gateway(requestChannel="invocationChannel")
public Boolean invokeService(Message<String> invocation);
}
@Bean
public IntegrationFlow errorHandlingFlow() {
return IntegrationFlows
.from("invocationFailureChannel")
.transform("payload.getFailedMessage()")
.handle(new GenericHandler<Object>() {
@Override
public Object handle(Object payload, Map<String, Object> headers) {
//Do Stuff
return false;
}
})
.get();
}
错误通道的回复应该回到实际调用网关的bean吗?但我得到了这个奇怪的例外:
o.s.m.c.GenericMessagingTemplate $ TemporaryReplyChannel - 收到回复消息,但接收线程在发送请求消息时因异常而退出
我尝试在请求和回复上设置超时,但这并没有真正帮助。我试着在调用网关的代码上放一个try-catch,但我也没有收到错误。
我甚至试过一个与下图所示相同的例子:
https://www.youtube.com/watch?v=mF2uq4DnVCg
我不知道为什么它不适合我。即使在示例示例中,我也会得到相同的错误。
答案 0 :(得分:1)
当网关将错误发送到错误通道时,它有一个新的'replyChannel`标头;旧的“花费” - 当网关收到错误时使用它。
这一行...
.transform("payload.getFailedMessage()")
正在搞乱事情,因为返回消息的变换器会覆盖标题,因此新的回复频道会被用尽的回复频道取代。
您可以使用
.transform("payload.failedMessage.payload")
并且框架将负责维护标头。如果您需要访问failedMessage
标头,则需要自定义转换器,并且您需要确保保留“新”replyChannel
标头。
或者,您可以在.enrichHeaders(s -> s.headerExpression("foo", "payload.failedMessage.headers['foo']"))
之前使用标题扩充器.transform()
复制失败邮件中的各个标题。