Spring 当可选出站网关失败时在消息之间传递相同负载的策略
我有一个工作流,它的消息负载(MasterObj)被丰富了好几次。在第二次扩展()期间,出站网关抛出了一个未知的hostException。enricher上的My error channel被调用,但error channel接收的消息是一个异常,该异常中的failed msg不再是My MasterObj(原始有效负载),而是从enricher上的请求有效负载表达式获取的对象 enricher调用出站网关,从业务角度看,这是可选的。我只想继续我的工作流程和我一直在充实的有效负载。文档说enricher上的错误通道可用于提供备用对象(enricher的请求通道将返回的对象),但即使我从enricher的错误通道返回对象,它仍然会将我带到工作流的整体错误通道 如何捕获enricher+出站网关中的错误,并继续使用我一直在处理的相同负载处理我的工作流 尝试为整个工作流维护单个有效负载对象是正确的策略吗?我需要随时访问它 我想在存储有效负载的会话中使用一个bean,但这似乎违背了SI的目的,不是吗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
谢谢。如果您担心
错误通道
流中的主对象
,请不要使用该请求有效负载表达式
,让原始的有效负载
进入enricher子流
您始终可以在该流程中使用简单的
另一方面,您是对的:通过流支持单个对象不是一个好策略。你们通过频道传送信息,每一步都被束缚是不好的。Spring集成的目的是能够随时从不同的MessageChannel类型进行切换,而生产者和消费者只需付出很少的努力。当消费者和生产者在不同的机器上时,也可以切换到分布式模式
如果你仍然需要多次丰富同一个对象,考虑编写一些自定义java代码。您可以使用
@MessagingGateway
来处理此问题,以获得Spring集成增益
没错,范围对于集成流来说并不好,因为您可以简单地在那里切换到不同的通道类型,然后丢失
ThreadLocal
上下文。谢谢。MasterObj中还有其他敏感/大型数据项,因此我无法将其传递给int-http:outbound-gateway,因为这将作为POST参数。我看了一下@MessageingGateway,看不出会有什么不同。看不到如何获得原始有效载荷。你能解释一下这种方法吗?如果我能在全球范围内解决“存储我的有效负载”的问题,那么我就不必担心出站网关的回报。在分布式模式上也是非常好的一点…我没想到!当然,从调用方的角度来看,消息传递网关与常规Java代码调用没有区别。因此,您将对象传递给gateway方法,在捕获
异常后,您将继续处理对象。