0

私が抱えている問題は次のとおりです。サービス ミックスとキャメル ルーティングを使用して、activeMQ 経由で JSON メッセージを消費者に送信しています。問題は、このコンシューマーがこのメッセージを処理するのにかかる時間が X であるため、メッセージの消費中にコンシューマーが停止またはクラッシュする可能性があることです。この場合、メッセージは半分消費者になり、十分に配信されたため、キューから既に削除されます。

メッセージが消費されたときにメッセージを削除しないようにキューを作成することはできますか?

ファイルシステムからファイルをインポートする典型的な方法では、ファイルが完全に処理され、トランザクションが完全にコミットされたときにのみ、ファイルを削除するか名前を変更します。では、ESB の世界では、私が終了するまでメッセージを保持し、私がメッセージを削除するように言うことができます。

私は現在、このメッセージを消費するために春の jms:listener-container と jms:listeners を使用しています。

4

1 に答える 1

1

あなたの問題は、JMS トランザクションが毎日解決するものです。

それに関する ActiveMQ からのメモはこちら

JMS でローカル トランザクションを簡単に使用でき、次のようなリスナー コンテナーをセットアップできます (sessionTransacted については注意してください)。

<bean id="myListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="concurrentConsumers" value="1" />
    <property name="connectionFactory" ref="jmsConnectionFactory" />
    <property name="destination" ref="myQueue" />
    <property name="messageListener" ref="myConsumerBean" />
    <property name="sessionTransacted" value="true" />
</bean>

次に、トランザクション セッションがあります。メッセージリスナーがメッセージの消費に失敗した場合、メッセージはキューにロールバックされます。メッセージリスナー Bean の「onMessage」メソッドが正常に返されない限り (例外がスローされない限り)、トランザクションはコミットされません (キューからメッセージが削除されます)。私はこれがあなたが望むものだと思います

于 2012-07-24T21:28:51.767 に答える