同じキューからのメッセージを処理する必要がある 2 つのコンシューマーがありますが、常にそのうちの 1 つだけです。私が達成しようとしていることのシーケンスは次のようなものです:
- (開始) どのコンシューマもキューにサブスクライブしていません
- Consumer1 がキューにサブスクライブする
- プロデューサがメッセージをキューに送信し、メッセージがコンシューマ 1 に配信されます
- Consumer1 はメッセージを処理し、しばらくしてから購読を解除します
- プロデューサはより多くのメッセージをキューに送信し、メッセージはキューに保存されます (autoDelete=false であるため、コンシューマがサブスクライブしていない場合でもキューは破棄されません)。
- Consumer2 はキューにサブスクライブし、保存されたメッセージを処理し、しばらくしてからサブスクライブを解除します。
- Consumer1 はサブスクライブし、メッセージを処理します... .. など
これは、最初は期待どおりに機能します。上記のステップ 5 の後、1 つだけがサブスクライブし、もう 1 つがサブスクライブを解除したにもかかわらず、プロデューサーからのメッセージが両方の consumer に交互に配信されることがわかります。
これを機能させるために使用しているコードは次のとおりです。
1. Code for consumer subscribes to queue
connection = amqp.createConnection( { url: "http://guest@localhost:5672" }
connection.on('ready', function() {
connection.queue(queuename, {autoDelete: false}, function(queue) {
queue.bind('myexchange', '1');
queue.subscribe(mycallback).addCallback(function(ok) { qtag = ok.consumerTag; }
}
2. code for consumer unsubcribe
queue.unsubscribe(qtag);
queue.on('basicCancelOk', function() {
}
このコード、または前述の目的のシーケンスを達成するための全体的なアプローチに何か問題がありますか?