Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “Spring集成网关退出”;由于一个例外情况;错误处理后不接收回复_Java_Spring_Spring Integration - Fatal编程技术网

Java “Spring集成网关退出”;由于一个例外情况;错误处理后不接收回复

Java “Spring集成网关退出”;由于一个例外情况;错误处理后不接收回复,java,spring,spring-integration,Java,Spring,Spring Integration,嘿,我将消息发送到http端点,因为我必须在选择性故障时触发错误流,所以在最终通过http出站网关路由消息之前,我将通过网关发送消息 @MessagingGateway(errorChannel="invocationFailureChannel") public interface Invocator { @Gateway(requestChannel="invocationChannel") public Boolean invokeService(Message<St

嘿,我将消息发送到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();
}
@MessagingGateway(errorChannel=“invocationFailureChannel”)
公共接口开票器{
@网关(requestChannel=“invocationChannel”)
公共布尔调用服务(消息调用);
}
@豆子
公共集成流错误处理流(){
返回积分流
.从(“调用失败频道”)
.transform(“payload.getFailedMessage()”)
.handle(新的GenericHandler(){
@凌驾
公共对象句柄(对象负载、映射头){
//做事
返回false;
}
})
.get();
}
错误通道的回复应该会传回实际调用网关的bean,对吗?但我有一个奇怪的例外:

o、 s.m.c.GenericMessageTemplate$TemporaryReplyChannel-收到回复消息,但由于发送请求消息时出现异常,接收线程已退出

我尝试在请求和回复上都设置一个超时,但这并没有真正起作用。我试图对调用网关的代码进行尝试捕获,但也没有出现错误

我甚至尝试了一个与中所示相同的示例:


我不知道为什么它对我不起作用。即使在一个示例中,我也会遇到相同的错误。

当网关将错误发送到错误通道时,它有一个新的“replyChannel”头;旧的是“已用过的”-它是在网关收到错误时使用的

这条线

.transform("payload.getFailedMessage()")
因为返回消息的转换器会覆盖报头,所以新的回复通道会被用过的通道取代,所以会把事情搞砸

你可以用

.transform("payload.failedMessage.payload")
框架将负责维护头文件。如果需要访问
failedMessage
标题,则需要自定义转换器,并且需要确保保留“new”
replyChannel
标题


或者,您可以使用头enricher-
.enrichHeaders(s->s.headerExpression(“foo”,“payload.failedMessage.headers['foo']))在
转换()之前从失败的消息复制单个头

所以
payload.failedMessage.payload
就像是一个技巧,使用常规转换器行为将异常消息头映射到失败消息上,对吗?当我在出站适配器上有一个表达式来计算通知,而不是在常规网关上有一个错误通道时,这是否也适用?successChannel和failurechannel是否会在标头中获得对新replychannel的引用?根据建议,还没有“new”
replychannel
——只有当异常被抛出到网关时才会发生这种情况,网关为错误流构造了一个带有回复通道的
ErrorMessage
。如果通知捕获了异常,您将永远无法获得新的replyChannel(并且根本不会调用错误流)。如果通知抛出异常(并且有一个
错误通道
),则在通知完成其工作后,会发生异常。是的,对于不返回消息的转换器,框架会采取正确的操作。这只是一个惯例,当一个转换器返回一条
消息时,假设该转换器已经承担了全部责任。哦,如果我有建议,我可以在故障通道上执行
转换(“payload.failedMessage”)
,然后它会传回网关,对吗?太棒了,谢谢。是的,在这种情况下,
failedMessage
replyChannel
尚未使用。这只是网关错误流上的一个问题。