Spring 集成:抛出异常时如何将 "error gateway" 与拆分器聚合器一起使用

Spring Integration: How to use an "error gateway" with Splitter Aggregator when Exception thrown

我看过很多关于这个主题的帖子,但似乎找不到解决我的特定问题的方法,我认为这是一个非常典型的问题,即:如何在使用拆分器/聚合器发生错误(抛出异常)。

我想到的最好的解释是 here。但是没有对 what/how filters/transformers 工作的确切解释。最后,作者发布了 "That worked!" 但没有发布更新的 SI.config.xml.

据我了解,想法是使用 "error gateway",它位于原始调用网关的下游和拆分器之后。这个网关的工作是如果抛出异常,处理它,但要确保(通过转换器或过滤器)所有消息都到达聚合器。

我的非常简化的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>

所以我的问题是,这个其他网关到底应该贴在哪里?以及如何配置filters/transformers(根据我收集的信息)将获取启动异常的消息并将其放回正确的通道(在记录它或其他任何内容之后......)以便所有消息都进入聚合器.

我查看了 SI 样本、SO 和 2 本 SI 书籍(Acton 中的 SI 和 Pro SI),但找不到这方面的示例。

解决方案如下:

<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>

processError 频道上的 error handler 应该咨询传入的 ErrorMessage 和 returns 一些补偿,这些补偿将发送给 aggregator

ErrorMessage 通常包含 MessagingExceptionfailedMessage,其中错误已引起。 failedMessage 包含所有有用的 headers 继续进行补偿。其中一些是 replyChannelerrorChannel,但对于您的 aggregator 情况,您需要所有这些 correlationIdsequenceNumbersequenceSize 等。在其他当您为 aggregator 构建要发送到下游的补偿消息时,您应该从 failedMessage.

复制所有 headers

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