【问题标题】:How do camel transactions deal with hardware failure骆驼交易如何处理硬件故障
【发布时间】:2012-09-17 16:30:55
【问题描述】:

我正在调查在 ServiceMix (v4.4.2) 中运行的骆驼交易。以下是我的路线:

from(WEBSERVICE_CAMEL_ENDPOINT).to("jms:queue:a");

from("jms:queue:a")
.transacted("PROPAGATION_REQUIRED")
    .process(new Processor() {
        @Override
        public void process(Exchange arg0) throws Exception {                
            System.exit(1); // A
        }
    })
;

以下是相关的bean:

<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="tcp://localhost:61616" />
</bean>

<bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
    <property name="transacted" value="true" />
    <property name="transactionManager" ref="txManager" />
    <property name="useMessageIDAsCorrelationID" value="true" />
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>

<bean id="PROPAGATION_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
    <property name="transactionManager" ref="txManager" />
    <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED" />
</bean>

当我运行它并调用 Web 服务时,ServiceMix 已关闭。当我重新启动 ServiceMix 时,消息已移至死信队列 (ActiveMQ.DLQ)。如果我在 A 点设置断点并使用任务管理器手动关闭 ServiceMix,我会看到相同的行为。

何时完成以及如何完成?

【问题讨论】:

    标签: transactions apache-camel activemq apache-servicemix


    【解决方案1】:

    首先,您将事务性协议与非事务性协议混合在一起。只要您知道您在哪里拥有事务性就可以了。

    当你运行你的第一个路由from(WEBSERVICE_CAMEL_ENDPOINT).to("jms:queue:a"); Camel 会尝试把你的消息从 WS 放到 ActiveMQ 中的队列 A。如果成功(在此过程中 SMX 不活动),ActiveMQ 已将消息放入队列 A 上的永久磁盘。到目前为止,没有事务。

    然后您的第二条路线将触发。 Camel 将在事务中从队列中读取消息。该消息将在 ActiveMQ 中被标记为删除。如果路由处理完全正常,没有任何异常,事务将提交。只有当 Camel 提交消息时,它才会从 ActiveMQ 中删除。在您的情况下,您异常结束路由,因此未提交事务,因此未从队列中删除消息。

    如果事务回滚(或根本未提交),ActiveMQ 重新传递策略将处理消息是否放回队列“a”或放入死信队列。

    在此处阅读更多信息。 http://activemq.apache.org/message-redelivery-and-dlq-handling.html

    【讨论】:

    • 感谢皮特的回答。但是我看到从 ActiveMQ 中删除的消息(它被移动到 DLQ)。事务何时回滚?当我重新启动 ServiceMix 时?如果是这种情况,那么消息在哪里持续存在?
    • 嗨。请阅读我帖子底部的链接。它解释了 ActiveMQ 中的回滚以及 ActiveMQ.DLQ 的工作原理。可以对其进行配置,以便您可以更好地控制这些事情。实际上,ActiveMQ(默认)使用 Kaha 持久性存储(磁盘持久性)来保存消息。 activemq.apache.org/kaha-persistence.html 但是,它可以配置为使用其他机制,例如 MySQL 等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    相关资源
    最近更新 更多