2012-10-30 9 views
5

私は、各サブスクライバがパブリッシャから送信されたメッセージの処理を完了したことを確認するまで、パブリッシュ側でブロックしたいパブリッシュ/サブスクライブの使用例があります。なぜChannel.waitForConfirmsOrDieブロックはありませんか?

RabbitMQとそのJava amqp-clientのChannel.waitForConfirmsOrDieメソッドを私のソリューションの一部として使用できると私は間違っていましたか?問題は、waitForConfirmsOrDieが実際にブロックするケースが見つからないことです。最後の呼び出し以降に発表されたすべてのメッセージがack'dまたはブローカーによってnack'dされているいずれかまで

待ち:

javadocsによると、waitForConfirmsOrDieをすることになっています。いずれかのメッセージがnackされた場合、waitForConfirmsOrDieはIOExceptionをスローします。非確認チャンネルで呼び出されると、すぐに戻ります。

このメソッドが実際に動作することをテストするために、私はthis example code from the RabbitMQ websiteで開始しました。

このサンプルコードは、パブリッシャとコンシューマをそれぞれ独自のスレッドに作成します。次に、パブリッシャは、コンシューマがメッセージを消費している間に、エクスチェンジにメッセージを送信します。 waitForConfirmsOrDie()の呼び出しによって、すべてのメッセージがackされるまで、パブリッシャーはブロックされているようです。

このサンプルコードは、私がやろうとしていたものと完全にマッチしたようです。しかし、それは私が思ったように動作していないようです。実際、消費者スレッドで自動受信メッセージをオフにした場合、waitForConfirmsOrDie()はただちに戻ります。

私は真の偽1を変更することで、自動ACKを切っ: ch.queueDeclare(QUEUE_NAME, false, false, false, null);ch.queueDeclare(QUEUE_NAME, true, false, false, null);(第2引数偽の代わりに、真)となります。私は、これは、もはや消費者が嫌なことを送るべきではないと考えています。

したがって、waitForConfirmsOrDie()は実際に何をしますか?それはいつブロックされますか?

waitForConfirmsOrDieが私の望むことをしない場合、続行する前にすべてのユーザがメッセージを受け取るまでパブリッシャを待機させる方法がありますか?

答えて

7

私の知る限り、これらの呼び出しは消費者からの確認を待たなければなりません。 waitForConfirms*メソッドの目的は、メッセージがブローカーに配信されたことを確認し、基本的な配信/失敗の通知タイプを提供することです。言い換えれば、rmqノードの1つ(またはすべてのノードさえ)が失敗した場合、または使用できなくなった場合に、通知を出さずにメッセージは消えません。

basicPublishコールの前にrmqを切断またはオフにすると、この例外が発生することがあります。

関連する問題