Spring Integration 拆分后的消息如何处理(即使会有错误)?

how to handle messages after splitting (even if there will be errors) in Spring Integration?

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

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

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

Spring 集成参考说:

A Splitter is another type of Message Endpoint whose responsibility is to accept a Message from its input channel, split that Message into multiple Messages, and then send each of those to its output channel.

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

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

那么拆分后的消息怎么处理,即使会有错误?

谢谢

好吧,处理下游错误确实不是 splitter 组件的职责。这是责任的混合体,不适合 EIP 模型。

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

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

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

Reference Manual. Also there is some clues in the Sample application 中查看更多信息。