Периодические проблемы в шаблоне преобразователя xslt при использовании сплиттера с каналом исполнителя - PullRequest
0 голосов
/ 12 февраля 2020

Я задал этот вопрос вчера, который Гэри решил. Это исправило проблему обработки ошибок (которая мне понадобится), но заставило меня обнаружить, что у меня периодически возникает проблема с преобразователем xslt, когда я получаю исключение при оценке шаблона в указанной строке c. И эта строка в шаблоне соответствует базовому совпадению.

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

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

Я получаю следующее сообщение об ошибке:

failure occurred in gateway sendAndReceive: error occurred in message handler, nested exception is java.lang.RuntimeException: Internal error evaluating template on line X

Где шаблон в этой строке находится ниже.

xslt

<xsl:template match="/">
   <request>
    ...
   </request>
</xsl:template> 

context

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