26

私の Java アプリケーションはメッセージを RabbitMQ exchange に送信し、exchange はメッセージをバインドされたキューにリダイレクトします。私はRabbitMQでSpringframework AMQP Javaプラグインを使用しています。

問題: メッセージはキューに入りますが、「未確認」状態のままで、「準備完了」にはなりません。

その理由は何ですか?

4

2 に答える 2

26

Unacknowledged メッセージは、コンシューマーによって読み取られたことを意味しますが、コンシューマーは、RabbitMQ ブローカーに ACK を返して、処理が完了したことを伝えていません。

私は Spring Framework プラグインにあまり詳しくありませんが、(コンシューマー向けに) どこかでキューを宣言すると、次のようになります ( http://www.rabbitmq.com/tutorials/tutorial-twoから取得)。 -java.html ):

channel.queueDeclare(queueName, ....)

次に、コンシューマーをセットアップします

bool ackMode = false;
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(queueName, ackMode, consumer);

上記の ackMode はブール値です。これを false に設定することで、RabbitMQ に対して、コンシューマーが与えられた各メッセージを確認することを明示的に伝えています。このフラグが true に設定されている場合、RabbitMQ で Unacknowledged カウントが表示されず、コンシューマーがメッセージを読み取るとすぐに (つまり、メッセージがコンシューマーに配信され、キューから削除されます)。

メッセージを確認するには、次のようにします。

QueueingConsumer.Delivery delivery = consumer.nextDelivery();
//...do something with the message...
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); //the false flag is to do with multiple message acknowledgement

消費者コードの一部を投稿していただければ、さらにお手伝いできるかもしれません...しかし、それまでの間、BlockingQueueConsumerを具体的に見てください。コンストラクターで、AcknowledgeModeを設定し、 nextMessage() getDeliveryTag() というメソッドを含む Message オブジェクトを返します。これは、basicAck で送り返す ID である Long を返します。

于 2012-08-13T08:24:32.417 に答える