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
通常包含 MessagingException
和 failedMessage
,其中错误已引起。 failedMessage
包含所有有用的 headers 继续进行补偿。其中一些是 replyChannel
和 errorChannel
,但对于您的 aggregator
情况,您需要所有这些 correlationId
、sequenceNumber
、sequenceSize
等。在其他当您为 aggregator
构建要发送到下游的补偿消息时,您应该从 failedMessage
.
复制所有 headers
我看过很多关于这个主题的帖子,但似乎找不到解决我的特定问题的方法,我认为这是一个非常典型的问题,即:如何在使用拆分器/聚合器发生错误(抛出异常)。
我想到的最好的解释是 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
通常包含 MessagingException
和 failedMessage
,其中错误已引起。 failedMessage
包含所有有用的 headers 继续进行补偿。其中一些是 replyChannel
和 errorChannel
,但对于您的 aggregator
情况,您需要所有这些 correlationId
、sequenceNumber
、sequenceSize
等。在其他当您为 aggregator
构建要发送到下游的补偿消息时,您应该从 failedMessage
.
headers