【问题标题】:Strategy for passing same payload between messages when optional outbound gateways fail当可选出站网关失败时在消息之间传递相同有效负载的策略
【发布时间】:2017-08-02 03:22:51
【问题描述】:

我有一个工作流,其消息有效负载 (MasterObj) 被丰富了几次。在第二次扩充 () 期间,出站网关引发了 UnknownHostException。我在丰富器上的错误通道被调用,但错误通道接收到的消息是一个异常,并且该异常中的失败消息不再是我的 MasterObj(原始有效负载),但它现在是从 request-payload-expression 获取的对象丰富者。

丰富器调用出站网关,并且在业务方面这是可选的。我只想使用我一直在丰富的有效负载继续我的工作流程。文档说,浓缩器上的错误通道可用于提供备用对象(对于浓缩器的请求通道将返回的对象),但即使我从浓缩器的错误通道返回一个对象,它仍然会将我带到工作流的整体错误通道。

我如何捕获来自丰富器 + 出站网关的错误,并使用我一直在处理的相同负载继续处理我的工作流?

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

我正在考虑使用一个 bean 范围为我存储有效负载的会话,但这似乎违背了 SI 的目的,不是吗?

谢谢。

【问题讨论】:

    标签: spring error-handling spring-integration


    【解决方案1】:

    好吧,如果您担心error-channel 流中的MasterObj,请不要使用request-payload-expression,而是让原始payload 进入浓缩器的子流。

    您始终可以在该流程中使用简单的<transformer expression="">

    另一方面,您是对的:通过流支持单个对象并不是一个好策略。您通过渠道传递消息,并且每一步都捆绑在一起并不好。 Spring Integration 的目的是能够随时从不同的 MessageChannel 类型切换,而对其生产者和消费者来说只需付出很小的努力。当消费者和生产者在不同的机器上时,你也可以切换到分布式模式。

    如果您仍然需要多次丰富同一个对象,请考虑编写一些自定义 Java 代码。您可以在此问题上使用@MessagingGateway 来获得 Spring 集成收益。

    没错,范围不适合集成流,因为您可以简单地切换到不同的通道类型并丢失 ThreadLocal 上下文。

    【讨论】:

    • 谢谢。 MasterObj 中还有其他敏感/大数据项,因此我无法将其传递给 int-http:outbound-gateway,因为这将被视为 POST 参数。我看了一下@MessageingGateway,我看不出会有什么不同。看不到如何获取原始有效载荷。你能稍微说明一下这种方法吗?如果我能解决“存储我的有效负载”全局问题,那么我就不必担心我猜出站网关的回报。分布式模式也很不错……没想到!
    • 当然,从调用者的角度来看,消息传递网关与常规 Java 代码调用没有区别。因此,您将对象传递给网关方法,在catch 出现异常之后,您将继续使用您的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 2021-06-28
    相关资源
    最近更新 更多