【问题标题】:how to handle messages after splitting (even if there will be errors) in Spring Integration?Spring Integration中拆分后如何处理消息(即使会出现错误)?
【发布时间】:2018-02-26 14:35:04
【问题描述】:

我有一个由 Spring Integration 提供支持的应用程序。 简而言之,方案是:

                                             |-> activator
gateWay -> splitter -> transformer -> router |-> ...
                                             |-> activator

例如,服务获取一些 json 数组,将其拆分为 json 对象,然后将它们转换为一些 java 对象。转换时可能会引发一些验证错误。

Spring 集成参考说:

拆分器是另一种类型的消息端点,其职责是 接受来自其输入通道的消息,将该消息拆分为 多个消息,然后将每个消息发送到其输出通道。

所以我希望,如果我发送一个带有一个无效对象的 json 数组,这会引发验证错误,那么所有其他消息都会正常处理,并且只有一个无效对象会被推送到错误通道。但事实并非如此。 当第一个验证异常抛出时,所有其他消息都不会被处理。

例如: ["correct", "correct", "invalid"] --> 会处理2条消息,没关系。 ["invalid", "correct", "correct"] --> 0 消息将被处理。

那么消息拆分后如何处理,即使出现错误?

谢谢

【问题讨论】:

    标签: spring-integration spring-messaging


    【解决方案1】:

    嗯,这不是splitter 组件处理下游错误的责任。这是一种责任混合,不适合 EIP 模型。

    当你有一个纯 Java 循环时也会发生同样的情况。是的,你可以在循环中使用try...catch,但从设计的角度来看,这看起来并不漂亮。因此,您决定将处理逻辑移至单独的方法并在那里使用 try...catch。你刚刚划分了一个责任。

    实际上,我们可以做同样的事情,我们是拆分器及其输出项的下游订阅者。它可以通过ExpressionEvaluatingRequestHandlerAdvice 及其onFailureExpressionfailureChanneltrapException = true 选项来实现。

    您应该将此建议用于您的 transformer 定义。

    Reference Manual 中查看更多信息。在Sample application中也有一些线索。

    【讨论】:

    • 好的,我明白了,谢谢。我被文档中的描述误导了“将该消息拆分为多个消息,然后将每个消息发送到其输出通道。”所以,我明白了,因为每个拆分的消息都有自己的生命周期。
    • 好吧,默认的 Java 行为是假定的。如果这不同或具有特定含义,我们会进行解释。
    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2014-10-23
    • 2016-01-19
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多