Spring Integration Gateway退出“由于异常”并且在处理错误后未收到回复

时间:2015-11-19 19:00:04

标签: java spring spring-integration

嘿,我正在向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

我不知道为什么它不适合我。即使在示例示例中,我也会得到相同的错误。

1 个答案:

答案 0 :(得分:1)

当网关将错误发送到错误通道时,它有一个新的'replyChannel`标头;旧的“花费” - 当网关收到错误时使用它。

这一行...

.transform("payload.getFailedMessage()")

正在搞乱事情,因为返回消息的变换器会覆盖标题,因此新的回复频道会被用尽的回复频道取代。

您可以使用

.transform("payload.failedMessage.payload")

并且框架将负责维护标头。如果您需要访问failedMessage标头,则需要自定义转换器,并且您需要确保保留“新”replyChannel标头。

或者,您可以在.enrichHeaders(s -> s.headerExpression("foo", "payload.failedMessage.headers['foo']"))之前使用标题扩充器.transform()复制失败邮件中的各个标题。