我正在使用骆驼从Solace队列下载消息,并且难以理解事务管理。Apache骆驼事务:直接传输不支持事务会话
流是这样的,消息从Solace队列下载,然后根据某些逻辑推送到许多Solace队列中的一个(称为分级)。从这些分段队列中,使用SEDA组件将消息路由到处理器(bean),最后将其发送到另一个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会话不直接支持运输
我的理解是它发生,因为SEDA不是一个物理队列时异常被抛出,但我因此消息丢失思想阶段安全队列将保留它。
路由配置:
<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队列来传递消息。 –