处理多线程 splitter/aggregator 编排内部的异常以转到聚合器而不是 MessagingGatewaySupport 的 errorChannel

Handling exceptions inside of multithreaded splitter/aggregator orchestration to go to aggregator instead of MessagingGatewaySupport's errorChannel

我目前有一个拆分器,它将一条消息拆分成类似的消息,我只添加了一个 header 值,当它通过编排时会产生不同的响应。

最后,这些消息被发送到聚合器以将响应聚合在一起。

目前,它们以多线程方式工作,但是当在 splitter/aggregator 编排内部抛出运行时异常并且它向我实例化 MessageGatewaySupport 时设置的 errorChannel 发送消息时会出现问题class。

我想知道是否有办法将异常发送到聚合器,这将允许我的程序继续并在我这边设置为多状态响应。

您可以在下面找到 splitter/aggregator 编排的简化设置。

<bean id="Splitter" class="com.MessageSplitter">
   <property name="splitFieldName" value="boundIndexList" />
</bean>

<bean id="Aggregator" class="com.MessageAggregator">
   <property name="wrapperNode" value="container" />
</bean>

<int:channel id="splitter_input" />
<int:channel id="splitter_output">
   <int:dispatcher task-executor="executor"/>
</int:channel>

<task:executor id="executor" pool-size="4"/>
<int:channel id="aggregator_input" />

<int:splitter id="splitter" input-channel="splitter_input" output-channel="splitter_output"
      ref="Splitter" method="splitHeaderParamByFieldName" />

<int:chain input-channel="splitter_output" output-channel="aggregator_input">
   <!-- ***RuntimeException thrown here sometimes*** -->
   <int-xml:xslt-transformer xsl-templates="XsltTemplate">
      <int-xml:xslt-param name="customHeader" expression="headers.boundIndexList" />
   </int-xml:xslt-transformer>

   <int:gateway request-channel="outbound_gateway" error-channel="exception_errorChannel" />

</int:chain>

<bean id="messageStore" class="org.springframework.integration.store.SimpleMessageStore" />


<int:aggregator input-channel="aggregator_input" output-channel="aggregator_output" ref="Aggregator"
      method="aggregateMessages" send-partial-result-on-expiry="false" expire-groups-upon-completion="true" message-store="viewResRemoveMessageFromStore" />

Splitter

public List<Message<String>> splitHeaderParamByFieldName(Message<String> message) throws XPathExpressionException {

   List<Message<String>> result = new ArrayList<Message<String>>();

   Object paramValue = message.getHeaders().get(splitFieldName);

   if (paramValue instanceof List<?>) {
      for (Object value : (List<?>) paramValue) {
         Message<String> newMessage = MessageBuilder.withPayload(message.getPayload())
                  .copyHeaders(message.getHeaders()).setHeader("customHeader", value).setHeader("receiveTimeout", 60000).build();
         result.add(newMessage);

      }
   } else {
      result.add(message);
   }

   return result;
}

现在我只在将消息转换为对第 3 方应用程序的请求的 xslt 中抛出了运行时异常。当发生此异常时,它会导致它通过在 MessagingGatewaySupport class 中定义为错误通道的通道发送,是否有办法让它转而进入聚合器?

其次,我在 xslt 下有一个网关,该网关的输出通道是否也必须是聚合器?我还没有从该网关抛出异常。

如果您需要更多信息来帮助我处理此请求,请告诉我。感谢您看一看并帮助我解决各种问题。

您需要分离器和链之间的另一个网关,在其错误通道上有一个流来转换故障并将其发送到聚合器。

来自您内部网关的回复将进入链的输出通道。