我使用Camel从Solace队列下载邮件,并且很难理解事务管理。
Flow就是这样,消息从Solace队列下载,然后根据某些逻辑被推送到许多Solace队列之一(称为staging)。从这些登台队列中,消息使用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>
如果 sequencer 引发异常,则消息保留在 in.solace.queue 中,但如果消息已从登台队列传递到SEDA到msgProcessor bean,则消息将丢失抛出以下异常。
无法创建JMS事务;嵌套异常是com.solacesystems.jms.ConfigurationException:直接传输不支持事务会话或XA会话
我的理解是它正在发生,因为SEDA不是一个物理队列,因此抛出异常时消息会丢失,但我认为分段Solace队列会保留它。
路由配置:
<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>
感谢有人能指出我做错了什么?
提前致谢。
答案 0 :(得分:1)
该错误听起来像是Solace设置连接工厂的配置问题。
仅供参考:seda端点不能在事务中被指望b / c它们是异步的。
如果你确实需要所有步骤的交易,我将消息放回另一个安慰队列而不是seda端点
答案 1 :(得分:1)
无法创建JMS事务;嵌套异常是com.solacesystems.jms.ConfigurationException:直接transpo不支持事务会话或XA会话 rt
Solace不允许使用启用了直接传输的JMS连接工厂的事务。这是您的例外原因。
这里的解决方案是禁用msgProcessor
bean使用的连接工厂上的直接传输,以使事务能够摆脱此异常。
如果序列发生器引发异常,则会在on.solace.queue上保留消息,但如果消息已从登台队列传递到SEDA到msgProcessor bean并且抛出异常,则会丢失该消息。 强>
从http://camel.apache.org/seda.html开始,SEDA似乎不支持恢复/交易。
此组件未实现任何类型的持久性或恢复, 如果VM在消息尚未处理时终止。如果你 需要持久性,可靠性或分布式SEDA,尝试使用其中任何一种 JMS或ActiveMQ。