2012-08-12 7 views
10

JavaアプリケーションがRabbitMQ交換にメッセージを送信し、リダイレクトメッセージをバインドキューに交換します。 私はRabbitMQでSpringframework AMQP javaプラグインを使用します。RabbitMQ:メッセージは「未確認」のままです

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

何故その理由が考えられますか?

答えて

13

未確認のメッセージは、消費者によって読み取られたことを意味しますが、消費者はRabbitMQブローカに処理を終了したことを通知することはありません。

私は春のフレームワークプラグインと過度に慣れていないんだけど、どこか(あなたの消費者のために)あなたのキューを宣言され、それは(http://www.rabbitmq.com/tutorials/tutorial-two-java.htmlから取られた)次のようになります。

channel.queueDeclare(queueName, ....) 

その後、あなたは、falseに設定することで、我々は明示的に私の消費者は、それが指定されている各メッセージを確認することのRabbitMQに設定上記のあなたの消費者

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

ackModeがブールであると言っています。このフラグが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オブジェクトが返されます。これはLongを返します。あなたがbasicAckに返信するID

4

消費者がbasicAckメソッドを必ず使用しても、未確認の状態に留まる別の理由で自分の2セントを追加するだけです。

オープンしたRabbitMQ接続を持つプロセスの複数のインスタンスが、その1つは、メッセージを未確認の状態に陥り、消費者の別のインスタンスがこのメッセージを再フェッチしないようにする可能性があります。

あなたは(ローカルマシンのために、これはローカルホストで利用可能であるべきである:15672)RabbitMQの管理コンソールにアクセスすることができ、かつ複数のインスタンスがチャネルを手に入れるかどうかを確認、または唯一の単一のインスタンスが現在アクティブである場合:

RabbitMQ Connections

冗長実行タスク(この場合は - java)を見つけて終了します。不正なプロセスを削除した後、メッセージがReady状態に再び飛びます。