我已经看过很多关于这个主题的帖子,但似乎无法找到我特定问题的解决方案,我认为这是一个非常典型的问题,即:如何在发生错误时继续处理消息(抛出异常)使用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)并且找不到这样的例子。
答案 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
包含所有有用的标题以继续进行补偿。其中一些是replyChannel
和errorChannel
,但对于aggregator
个案,您需要correlationId
,sequenceNumber
,sequenceSize
等所有内容。当您构建补偿消息以向{4}}的下游发送时,您应该复制aggregator
的所有headers
。