Java “Spring集成网关退出”;由于一个例外情况;错误处理后不接收回复
嘿,我将消息发送到http端点,因为我必须在选择性故障时触发错误流,所以在最终通过http出站网关路由消息之前,我将通过网关发送消息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
@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
尚未使用。这只是网关错误流上的一个问题。