Spring Integration:抛出Exception时如何使用Splitter Aggregator使用“错误网关”

时间:2016-12-19 16:59:24

标签: error-handling spring-integration gateway

我已经看过很多关于这个主题的帖子,但似乎无法找到我特定问题的解决方案,我认为这是一个非常典型的问题,即:如何在发生错误时继续处理消息(抛出异常)使用Splitter / Aggregator。

我遇到的最好的解释是here。但是没有解释过滤器/变压器究竟是什么/如何工作的。最后,作者发布了“那有效!”但没有发布更新的SI.config.xml。

根据我的理解,我们的想法是使用“错误网关”,它位于原始呼叫网关的下游和分离器之后。这个网关的工作是,如果抛出异常,处理它,但要确保(通过变换器或过滤器)所有消息都将它传递给聚合器。

我非常简化的SI.config.xml,如果或多或少像这样:

<int:gateway id="myGateway" ... /> // incoming gateway
<int:chain ... input-channel="in" output-channel="out">
  <int:splitter ... />
  <int:service-activator />
  <int:aggregator />
</int:chain>

所以我的问题是,究竟要坚持这个其他网关?如何配置过滤器/变换器(从我收集的内容)将获取启动异常的消息并将其放回正确的通道(在记录它或其他任何...后),以便所有消息进入聚合器。 / p>

我查看过SI上的SI样本和2本SI书籍(Acton和Pro SI中的SI)并且找不到这样的例子。

1 个答案:

答案 0 :(得分:0)

解决方案如下:

<int:chain ... input-channel="in" output-channel="out">
  <int:splitter ... />
  <int:gateway request-channel="processChannel" errorChannel="processError"/>
  <int:aggregator />
</int:chain>

<int:chain input-channel="processChannel">
  <int:service-activator />
</int:chain>

error handler频道上的processError应该咨询传入的ErrorMessage并返回一些补偿,这些补偿将发送到aggregator

ErrorMessage通常包含MessagingException,其中failedMessage出错。 failedMessage包含所有有用的标题以继续进行补偿。其中一些是replyChannelerrorChannel,但对于aggregator个案,您需要correlationIdsequenceNumbersequenceSize等所有内容。当您构建补偿消息以向{4}}的下游发送时,您应该复制aggregator的所有headers

了解更多信息:http://docs.spring.io/spring-integration/docs/4.3.5.RELEASE/reference/html/configuration.html#namespace-errorhandler