Transactions Apache Camel事务:直接传输不支持事务处理会话

Transactions Apache Camel事务:直接传输不支持事务处理会话,transactions,apache-camel,solace,Transactions,Apache Camel,Solace,我正在使用Camel从Solace队列下载消息,并且很难理解事务管理 流程是这样的,消息从Solace队列下载,然后根据某种逻辑推送到许多Solace队列中的一个(称为暂存)。从这些暂存队列中,使用SEDA组件将消息路由到处理器(bean),最后将其发送到另一个Solace队列 我已将事务配置为 <bean id="propagationReqd" class="org.apache.camel.spring.spi.SpringTransactionPolicy">

我正在使用Camel从Solace队列下载消息,并且很难理解事务管理

流程是这样的,消息从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>

若sequencer引发异常,则消息将保留在.solace.queue中的,但若消息已从暂存队列传递到SEDA到msgProcessor bean并引发以下异常,则消息将丢失

无法创建JMS事务;嵌套异常为com.solacesystems.jms.ConfigurationException:直接传输不支持事务处理会话或XA会话

我的理解是,这是因为SEDA不是一个物理队列,所以当抛出异常时,消息会丢失,但我认为staging 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&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>

${headers.MsgId}=='0'
${headers.MsgId}=='1'
...
...
...
如果有人能指出我做错了什么,我将不胜感激

提前谢谢

  • 该错误听起来像是Solace设置连接工厂的配置问题

  • 仅供参考:seda端点不能在事务b/c中使用,因为它们是异步的

  • 如果您确实需要执行所有步骤的事务,我会将消息放回另一个solace队列,而不是seda端点

  • 该错误听起来像是Solace设置连接工厂的配置问题

  • 仅供参考:seda端点不能在事务b/c中使用,因为它们是异步的

  • 如果您确实需要执行所有步骤的事务,我会将消息放回另一个solace队列,而不是seda端点

  • 无法创建JMS事务;嵌套异常为com.solacesystems.jms.ConfigurationException:直接传输不支持事务处理会话或XA会话

    Solace不允许使用启用直接传输的JMS连接工厂的事务。这就是您出现异常的原因

    这里的解决方案是在
    msgProcessor
    bean使用的连接工厂上禁用直接传输,以使事务能够消除此异常

    如果sequencer引发异常,则在in.solace.queue上保留该消息,但如果消息已从暂存队列传递到SEDA并传递到msgProcessor bean,并且引发以下异常,则该消息将丢失。

    从中可以看出,SEDA似乎不支持恢复/事务

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

    无法创建JMS事务;嵌套异常为com.solacesystems.jms.ConfigurationException:直接传输不支持事务处理会话或XA会话

    Solace不允许使用启用直接传输的JMS连接工厂的事务。这就是您出现异常的原因

    这里的解决方案是在
    msgProcessor
    bean使用的连接工厂上禁用直接传输,以使事务能够消除此异常

    如果sequencer引发异常,则在in.solace.queue上保留该消息,但如果消息已从暂存队列传递到SEDA并传递到msgProcessor bean,并且引发以下异常,则该消息将丢失。

    从中可以看出,SEDA似乎不支持恢复/事务

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


    但消息不会在VM终止时保留,不会在应用程序引发异常时保留。但消息不会在VM终止时保留,不会在应用程序引发异常时保留。Matt,由于定义了SLA,我必须使用SEDA来处理消息,但会考虑引入另一个Solace队列来传递消息。Matt,由于定义了SLA,我不得不使用SEDA来处理消息,但我会考虑引入另一个Solace队列来传递消息。