2016-10-06 64 views
0

我正在使用骆驼从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&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. 错误听起来像是一个配置问题w/Solace设置连接工厂。

  2. 仅供参考seda端点不能在事务中计数b/c它们是异步的。

  3. 如果你真的需要交易的B/W的所有步骤,我把消息回到另一个慰藉队列,而不是一个终点SEDA

+0

马特,我必须使用SEDA,因为定义了SLA来处理消息,但会考虑引入另一个Solace队列来传递消息。 –

1

无法创建JMS事务;嵌套的例外是com.solacesystems.jms.ConfigurationException:成交会话或XA会话没有直接TRANSPO RT支持

安慰不允许交易,使启用直接传输使用JMS连接工厂。这是你例外的原因。

此处的解决方案是禁用您的msgProcessor bean使用的连接工厂的直接传输,以使事务摆脱此异常。

消息被保持在in.solace.queue如果异常是由定序器升高,但如果消息已经被从队列暂存到SEDA到msgProcessor豆和以下抛出异常传递它丢失。

http://camel.apache.org/seda.html看来,SEDA似乎不支持恢复/事务。

如果VM在消息尚未处理时终止,则此组件不会执行任何类型的持久性或恢复, 。如果 需要持久性,可靠性或分布式SEDA,请尝试使用 JMS或ActiveMQ。

+0

,但如果** VM终止**,消息将不会被保留,而不是应用程序抛出一些异常。 –