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の永続ディスクに置きます。これまでのところ、トランザクションはありません。

次に、2番目のルートがトリガーされます。Camelは、トランザクションを使用してキューからメッセージを読み取ります。メッセージは、ActiveMQ内で削除のフラグが立てられます。ルートが例外なく完全に正常に処理された場合、トランザクションはコミットされます。Camelがメッセージをコミットした場合にのみ、ActiveMQから削除されます。あなたの場合、ルートを異常終了しているため、トランザクションはコミットされていないため、メッセージはキューから削除されません。

トランザクションがロールバックされた(または単にコミットされなかった)場合、メッセージがキュー「a」に戻されるか、デッドレターキューに入れられるかをActiveMQ再配信ポリシーが処理します。

詳しくはこちらをご覧ください。 http://activemq.apache.org/message-redelivery-and-dlq-handling.html

于 2012-09-17T20:29:03.500 に答える