JavaアプリケーションがRabbitMQ交換にメッセージを送信し、リダイレクトメッセージをバインドキューに交換します。 私はRabbitMQでSpringframework AMQP javaプラグインを使用します。RabbitMQ:メッセージは「未確認」のままです
問題:メッセージはキューに入りますが、「未確認」状態にとどまり、「準備完了」にはなりません。
何故その理由が考えられますか?
JavaアプリケーションがRabbitMQ交換にメッセージを送信し、リダイレクトメッセージをバインドキューに交換します。 私はRabbitMQでSpringframework AMQP javaプラグインを使用します。RabbitMQ:メッセージは「未確認」のままです
問題:メッセージはキューに入りますが、「未確認」状態にとどまり、「準備完了」にはなりません。
何故その理由が考えられますか?
未確認のメッセージは、消費者によって読み取られたことを意味しますが、消費者は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
消費者がbasicAckメソッドを必ず使用しても、未確認の状態に留まる別の理由で自分の2セントを追加するだけです。
オープンしたRabbitMQ接続を持つプロセスの複数のインスタンスが、その1つは、メッセージを未確認の状態に陥り、消費者の別のインスタンスがこのメッセージを再フェッチしないようにする可能性があります。
あなたは(ローカルマシンのために、これはローカルホストで利用可能であるべきである:15672)RabbitMQの管理コンソールにアクセスすることができ、かつ複数のインスタンスがチャネルを手に入れるかどうかを確認、または唯一の単一のインスタンスが現在アクティブである場合:
冗長実行タスク(この場合は - java)を見つけて終了します。不正なプロセスを削除した後、メッセージがReady状態に再び飛びます。