【问题标题】:Apache Camel Transaction: Transacted sessions are not supported with direct transportApache Camel 事务:直接传输不支持事务会话
【发布时间】:2016-10-07 09:11:05
【问题描述】:

我正在使用 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 引发异常,消息将保留在 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&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>

如果有人能指出我做错了什么?

提前致谢。

【问题讨论】:

    标签: transactions apache-camel solace


    【解决方案1】:
    1. 该错误听起来像是 Solace 设置连接工厂的配置问题。

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

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

    【讨论】:

    • Matt,由于定义了 SLA 来处理消息,我必须使用 SEDA,但会考虑引入另一个 Solace 队列来传递消息。
    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    • 但是如果 VM 终止,消息将不会被保留,如果应用程序抛出一些异常则不会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多