2016-10-06 6 views
0

Я использую Camel для загрузки сообщений из очереди Solace и затруднения в понимании управления транзакциями.Apache Camel Транзакция: Транзактные сеансы не поддерживаются прямым транспортом

Поток подобен этому, сообщение загружается из очереди Solace, а затем помещается в одну из многих очередей Solace (называемую стадией) в зависимости от некоторой логики. Из этих промежуточных очередей сообщение направляется процессору (bean) с использованием компонента SEDA и, наконец, отправляется в очередную очередь Solace.

Я настроил сделка, как

<bean id="propagationReqd" class="org.apache.camel.spring.spi.SpringTransactionPolicy"> 
     <property name="transactionManager" ref="jmsTransactionManager" /> 
     <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED" /> 
</bean> 

Сообщение сохраняется на in.solace.queue если возбуждается исключение секвенсор но теряется, если сообщение было передано от постановки очереди на SEDA на msgProcessor bean и последующее исключение.

Не удалось создать JMS-транзакцию; вложенное исключение com.solacesystems.jms.ConfigurationException: транзакционные сессии или сессии XA не поддерживаются с прямым транспортом

Я понимаю, что это происходит потому, что Седа не является физической очередь, следовательно, сообщение теряется, когда исключение, но я Очередь мышления будет сохранена.

Routing конфигурации:

<camel:route id="msg.router"> 
    <camel:from uri="{{in.solace.queue}}" /> 
    <camel:transacted ref="propagationReqd" /> 
    <camel:to uri="direct:msgSequencer" /> 
</camel:route> 

<camel:route id="msg.processor"> 
    <camel:from uri="direct:msgSequencer" /> 
    <camel:transacted ref="propagationReqd" /> 
    <camel:process ref="sequencer" /> 
    <camel:choice> 
     <camel:when> 
      <camel:simple>${headers.MsgId} == '0'</camel:simple> 
      <camel:to uri="{{stage.solace.queue.0}}" /> 
     </camel:when> 
     <camel:when> 
      <camel:simple>${headers.MsgId} == '1'</camel:simple> 
      <camel:to uri="{{stage.solace.queue.1}}" /> 
     </camel:when> 
     ... 
     ... 
     ... 
    </camel:choice> 
</camel:route> 

<camel:route id="msg.seda.0"> 
    <camel:from uri="{{stage.solace.queue.0}}" /> 
    <camel:transacted ref="propagationReqd" /> 
    <camel:to uri="seda:processor.0" /> 
</camel:route> 

<camel:route id="msg.seda.1"> 
    <camel:from uri="{{stage.solace.queue.1}}" /> 
    <camel:transacted ref="propagationReqd" /> 
    <camel:to uri="seda:processor.1" /> 
</camel:route> 

<camel:route id="msg.process.0"> 
    <camel:from uri="seda:processor.0?concurrentConsumers=4&amp;waitForTaskToComplete=Never&amp;purgeWhenStopping=true" /> 
    <camel:transacted ref="propagationReqd" /> 
    <camel:process ref="msgProcessor" /> 
    <camel:to uri="{{final.queue}}" /> 
</camel:route> 

<camel:route id="msg.process.1"> 
    <camel:from uri="seda:processor.1?concurrentConsumers=4&amp;waitForTaskToComplete=Never&amp;purgeWhenStopping=true" /> 
    <camel:transacted ref="propagationReqd" /> 
    <camel:process ref="msgProcessor" /> 
    <camel:to uri="{{final.queue}}" /> 
</camel:route> 

Цените, если кто-то может указать на то, что я делаю неправильно?

Заранее спасибо.

ответ

1
  1. Ошибка звучит как проблема с конфигурацией с фабрикой по установлению соединения Solace.

  2. FYI: Конечные точки seda не могут рассчитываться в транзакции b/c, они асинхронны.

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

+0

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

1

Не удалось создать JMS сделки; вложенное исключение составляет com.solacesystems.jms.ConfigurationException: транзакционные сессий или сессий XA не поддерживается с прямым TRANSPO к.т.

Solace не допускает сделки, которые делают использование фабрик соединений JMS с прямым транспортом включен. Это является причиной вашего исключения.

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

Сообщение сохраняется на in.solace.queue, если возбуждается исключение секвенсор, но теряется, если сообщение было передано от постановки очереди на SEDA к msgProcessor боба и после исключения.

От http://camel.apache.org/seda.html, похоже, что SEDA не поддерживает восстановление/транзакции.

Этот компонент не реализует никакого вида сохранения или восстановления, , если VM завершает работу, пока сообщения еще не обработаны. Если вы нуждаетесь в постоянной, надежной или распределенной SEDA, попробуйте использовать либо JMS, либо ActiveMQ.

+0

, но сообщение не будет сохранено в случае, если ** VM завершает **, а не если какое-либо исключение выбрано приложением. –