Error handling Spring集成:如何使用;“错误网关”;引发异常时使用拆分器聚合器

Error handling Spring集成:如何使用;“错误网关”;引发异常时使用拆分器聚合器,error-handling,spring-integration,gateway,Error Handling,Spring Integration,Gateway,关于这个主题,我已经看过不少文章,但似乎找不到解决我的具体问题的方法,我认为这是一个非常典型的问题,即:如何使用拆分器/聚合器在发生错误(引发异常)时继续处理消息 我遇到的最好的解释是。但是没有解释滤波器/变压器的工作原理。最后,作者发布了“成功了!”但没有发布更新的SI.config.xml 据我所知,这个想法是使用一个“错误网关”,它位于原始调用网关的下游,在拆分器之后。该网关的任务是在抛出异常时处理异常,但要确保(通过转换器或过滤器)所有消息都发送到聚合器 我的非常简化的SI.config

关于这个主题,我已经看过不少文章,但似乎找不到解决我的具体问题的方法,我认为这是一个非常典型的问题,即:如何使用拆分器/聚合器在发生错误(引发异常)时继续处理消息

我遇到的最好的解释是。但是没有解释滤波器/变压器的工作原理。最后,作者发布了“成功了!”但没有发布更新的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>
//传入网关
所以我的问题是,这另一个入口到底应该放在哪里?以及如何配置过滤器/转换器(从我收集的信息中)来抓取启动异常的消息并将其放回正确的通道(在记录它或其他之后…),以便所有消息都发送到聚合器


我查看了SI示例,以及2本SI书籍(Acton和Pro SI中的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消息
,并返回一些补偿,这些补偿将发送到
聚合器

error消息
通常包含导致错误的
MessaginException
failedMessage
。该
failedMessage
包含所有有用的标题,以进行补偿。其中一些是
replyChannel
errorChannel
,但是对于您的
聚合器
情况,您需要所有这些
相关ID
序列号
序列大小
等。换句话说,当您为
聚合器
构建要转发到下游的补偿消息时,您应该从该
失败消息
复制所有
标题


更多信息:

好的,我明白你的意思。我不知道这是如此“容易”,我从来没有见过这样的例子。这很有道理,但我不认为我自己会发现它;当你可以简单地使用一个服务激活器时,就好像你“无缘无故”在中间链中添加了一个网关。当然,使用网关可以定义错误通道。。。当然,您可以添加一个处理程序/服务激活器来处理异常,然后添加头,以便流继续流向聚合器。非常非常感谢!您可以在参考手册中找到类似的内容,其中我们讨论了chain from chain Right You,确切的用例将在“从链中调用链”下讨论。我没有仔细看那个部分,因为我不认为这是使用“错误网关”所需要做的。但是,是的,这里有很好的解释。谢谢