Я использую 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&waitForTaskToComplete=Never&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&waitForTaskToComplete=Never&purgeWhenStopping=true" />
<camel:transacted ref="propagationReqd" />
<camel:process ref="msgProcessor" />
<camel:to uri="{{final.queue}}" />
</camel:route>
Цените, если кто-то может указать на то, что я делаю неправильно?
Заранее спасибо.
Мэтт, я должен использовать SEDA из-за определенного SLA для обработки сообщений, но подумает о том, чтобы ввести очередную очередь Solace для передачи сообщений. –