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

时间:2018-02-26 14:35:04

标签: spring-integration spring-messaging

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

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

例如,service获取一些json数组,将其拆分为json对象,然后将它们转换为某个java对象。转换它会导致一些验证错误。

Spring Integration Reference说:

  

Splitter是另一种负责的消息端点   从其输入通道接受消息,将该消息拆分为   多个消息,然后将每个消息发送到其输出通道。

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

例如: ["correct", "correct", "invalid"] -->将处理2封邮件,这没关系。 将处理["invalid", "correct", "correct"] --> 0条消息。

那么分割后如何处理消息,即使会有错误?

由于

1 个答案:

答案 0 :(得分:1)

那么,处理下游错误的组件责任确实不是splitter。这是一种责任混合,不适合EIP模式。

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

我们可以这样做,实际上,我们是分配器及其下游订户的输出项。可以使用ExpressionEvaluatingRequestHandlerAdvice及其onFailureExpressionfailureChanneltrapException = true选项来实现。

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

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