私の Java アプリケーションはメッセージを RabbitMQ exchange に送信し、exchange はメッセージをバインドされたキューにリダイレクトします。私はRabbitMQでSpringframework AMQP Javaプラグインを使用しています。
問題: メッセージはキューに入りますが、「未確認」状態のままで、「準備完了」にはなりません。
その理由は何ですか?
私の Java アプリケーションはメッセージを RabbitMQ exchange に送信し、exchange はメッセージをバインドされたキューにリダイレクトします。私はRabbitMQでSpringframework AMQP Javaプラグインを使用しています。
問題: メッセージはキューに入りますが、「未確認」状態のままで、「準備完了」にはなりません。
その理由は何ですか?
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 を返します。