Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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
Spring 当可选出站网关失败时在消息之间传递相同负载的策略_Spring_Error Handling_Spring Integration - Fatal编程技术网

Spring 当可选出站网关失败时在消息之间传递相同负载的策略

Spring 当可选出站网关失败时在消息之间传递相同负载的策略,spring,error-handling,spring-integration,Spring,Error Handling,Spring Integration,我有一个工作流,它的消息负载(MasterObj)被丰富了好几次。在第二次扩展()期间,出站网关抛出了一个未知的hostException。enricher上的My error channel被调用,但error channel接收的消息是一个异常,该异常中的failed msg不再是My MasterObj(原始有效负载),而是从enricher上的请求有效负载表达式获取的对象 enricher调用出站网关,从业务角度看,这是可选的。我只想继续我的工作流程和我一直在充实的有效负载。文档说enr

我有一个工作流,它的消息负载(MasterObj)被丰富了好几次。在第二次扩展()期间,出站网关抛出了一个未知的hostException。enricher上的My error channel被调用,但error channel接收的消息是一个异常,该异常中的failed msg不再是My MasterObj(原始有效负载),而是从enricher上的请求有效负载表达式获取的对象

enricher调用出站网关,从业务角度看,这是可选的。我只想继续我的工作流程和我一直在充实的有效负载。文档说enricher上的错误通道可用于提供备用对象(enricher的请求通道将返回的对象),但即使我从enricher的错误通道返回对象,它仍然会将我带到工作流的整体错误通道

如何捕获enricher+出站网关中的错误,并继续使用我一直在处理的相同负载处理我的工作流

尝试为整个工作流维护单个有效负载对象是正确的策略吗?我需要随时访问它

我想在存储有效负载的会话中使用一个bean,但这似乎违背了SI的目的,不是吗


谢谢。

如果您担心
错误通道
流中的
主对象
,请不要使用该
请求有效负载表达式
,让原始的
有效负载
进入enricher子流

您始终可以在该流程中使用简单的

另一方面,您是对的:通过流支持单个对象不是一个好策略。你们通过频道传送信息,每一步都被束缚是不好的。Spring集成的目的是能够随时从不同的MessageChannel类型进行切换,而生产者和消费者只需付出很少的努力。当消费者和生产者在不同的机器上时,也可以切换到分布式模式

如果你仍然需要多次丰富同一个对象,考虑编写一些自定义java代码。您可以使用

@MessagingGateway
来处理此问题,以获得Spring集成增益


没错,范围对于集成流来说并不好,因为您可以简单地在那里切换到不同的通道类型,然后丢失
ThreadLocal
上下文。

谢谢。MasterObj中还有其他敏感/大型数据项,因此我无法将其传递给int-http:outbound-gateway,因为这将作为POST参数。我看了一下@MessageingGateway,看不出会有什么不同。看不到如何获得原始有效载荷。你能解释一下这种方法吗?如果我能在全球范围内解决“存储我的有效负载”的问题,那么我就不必担心出站网关的回报。在分布式模式上也是非常好的一点…我没想到!当然,从调用方的角度来看,消息传递网关与常规Java代码调用没有区别。因此,您将对象传递给gateway方法,在
捕获
异常后,您将继续处理对象。