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
及其 onFailureExpression
、failureChannel
和 trapException = true
选项来实现。
您应该将此建议用于您的 transformer
定义。
在 Reference Manual. Also there is some clues in the Sample application 中查看更多信息。
我有一个由 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
及其 onFailureExpression
、failureChannel
和 trapException = true
选项来实现。
您应该将此建议用于您的 transformer
定义。
在 Reference Manual. Also there is some clues in the Sample application 中查看更多信息。