我有一个由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
条消息。
那么分割后如何处理消息,即使会有错误?
由于
答案 0 :(得分:1)
那么,处理下游错误的组件责任确实不是splitter
。这是一种责任混合,不适合EIP模式。
当您拥有纯Java循环时也会发生同样的情况。是的,您可以在循环中使用try...catch
,但从设计角度来看,这看起来并不漂亮。因此,您决定将处理逻辑移至单独的方法并在那里使用try...catch
。你刚刚分了一个责任。
我们可以这样做,实际上,我们是分配器及其下游订户的输出项。可以使用ExpressionEvaluatingRequestHandlerAdvice
及其onFailureExpression
,failureChannel
和trapException = true
选项来实现。
您应该将此建议用于transformer
定义。
查看Reference Manual中的更多信息。 Sample application还有一些线索。