1

我正在调查在 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 并使用任务管理器,我会看到相同的行为。

何时完成以及如何完成?

4

1 回答 1

2

首先,您将事务性协议与非事务性协议混合在一起。只要您知道您在哪里拥有事务性,那很好。

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

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

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

在这里阅读更多。 http://activemq.apache.org/message-redelivery-and-dlq-handling.html

于 2012-09-17T20:29:03.500 回答