Обработка исключений внутри многопоточной оркестровки сплиттера / агрегатора до go для агрегатора вместо MessagingGatewaySupport errorChannel - PullRequest
0 голосов
/ 10 февраля 2020

В настоящее время у меня есть разделитель, который разбивает сообщение на похожие сообщения, где я добавляю только значение заголовка, которое приведет к различным ответам при прохождении через оркестровку.

Наконец, эти сообщения отправляются в агрегатор для агрегирования ответа.

В настоящее время они работают в многопоточном режиме, но проблема возникает, когда возникает исключительная ситуация во время выполнения, когда внутри оркестровки сплиттера / агрегатора, и он отправляет сообщение в errorChannel, который был установлен, когда я создал экземпляр класса MessageGatewaySupport ,

Мне было интересно, если бы вместо этого был способ отправить исключение вместо агрегатора, это позволило бы моей программе продолжить работу и было бы установлено в качестве ответа с несколькими состояниями на моей стороне.

Ниже вы можете найти упрощенную настройку оркестровки сплиттера / агрегатора.

<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;
}

В настоящий момент в xslt выдается только исключение времени выполнения, преобразующее сообщение в запрос к стороннему приложению. Когда возникает это исключение, оно вызывает его отправку по каналу, который был определен как канал ошибок в классе MessagingGatewaySupport, есть ли способ сделать так, чтобы это исключение вместо этого отправлялось в агрегатор?

Во-вторых, у меня есть шлюз ниже xslt, должен ли выходной канал этого шлюза также быть агрегатором? Мне еще предстоит исключение из этих ворот.

Пожалуйста, дайте мне знать, если вам требуется дополнительная информация, чтобы помочь мне с этим запросом. Я ценю, что вы посмотрели и помогли мне с различными проблемами.

1 Ответ

0 голосов
/ 10 февраля 2020

Вам нужен еще один шлюз между сплиттером и цепочкой, с потоком в его канале ошибок для преобразования и отправки сбоя в агрегатор.

Ответ от вашего внутреннего шлюза будет go на выходе цепочки канал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...