11

CamelのJMSコンポーネントは、メッセージを受信するためにSpringsDefaultMessageListenerContainerを使用していることを知っています。メッセージの確認にCLIENT_ACKNOWLEDGEモードを使用するように構成できます。私の質問は、message.acknowledge()メソッドがいつ呼び出されるのかということです。スプリングのリスナーコンテナによって内部的に呼び出されますか?

または、どういうわけか自分の意志でメッセージを確認できますか?

これらのメッセージの処理中にアプリがクラッシュし、トランザクションにするのが少し重すぎるように思われるためにメッセージが失われるというシナリオを避けたいと思います。

4

1 に答える 1

17

わかった。ソースコードを介してデバッグとスキャンを行った後、CamelがSpringMessageListenerContainersを使用していることがわかりました。AbstractMessageListenerContainerは、CLIENT_AKNOWLEDGEモードの場合、メッセージを確認するcomitIfNecessaryメソッドを呼び出します。これは、登録されたMessageListenerがメッセージを正常に処理した後にのみ発生します(例外なし)

CamelはEndpointMessageListenerを使用し、最終的には次のプロセッサ(またはプロデューサー)のプロセスメソッドを呼び出します。これは古典的な責任の連鎖であるため、ルート上のいずれかのプロセッサがExchangeで例外をスローしたり、例外を設定したりすると、EndpointMessageListenerによって再スローされ、AbstractMessageListenerがメッセージを確認できなくなります。

于 2012-11-21T21:36:34.840 に答える