【问题标题】:Spring Integration: How to use an "error gateway" with Splitter Aggregator when Exception thrownSpring Integration:抛出异常时如何在 Splitter Aggregator 中使用“错误网关”
【发布时间】:2017-05-04 19:04:48
【问题描述】:

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

我遇到的最好的解释是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>

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

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

【问题讨论】:

    标签: error-handling spring-integration gateway


    【解决方案1】:

    解决方案如下:

    <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 并返回一些补偿,这些补偿将发送到aggregator

    ErrorMessage 通常包含 MessagingExceptionfailedMessage,其中会导致错误。 failedMessage 包含所有有用的标题以继续进行补偿。其中一些是replyChannelerrorChannel,但对于您的aggregator 案例,您需要所有这些correlationIdsequenceNumbersequenceSize 等。换句话说,当您构建要发送到的补偿消息时aggregator 的下游,您应该从 failedMessage 复制所有 headers

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

    【讨论】:

    • 好吧,我明白你在说什么。我不知道它是如此“简单”,我从未见过这样的例子。这是完全有道理的,但我认为我自己永远不会发现它。当您可以简单地使用服务激活器时,就好像您“无偿地”在链的中间添加了一个网关。但是,当然,使用网关可以让你定义一个错误通道......当然,你可以添加一个处理程序/服务激活器来处理异常,然后添加标头,以便流程继续到聚合器。非常非常感谢!
    • 您可以在参考手册docs.spring.io/spring-integration/docs/4.3.5.RELEASE/reference/… 中找到类似的内容,我们在这里讨论链中链
    • 没错,确切的用例在“从链中调用链”中讨论。我没有仔细查看该部分,因为我认为这不是我需要做的才能使用“错误网关”。但是,是的,那里有很好的解释。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多