私はRabbitMQでメッセージを処理するためにSpring AMQPを使用しています。
問題は次のとおりです。
1. RabbitMQ内で準備状態のメッセージが3つあります。
2.最初に1つがMessageListenerによって取得され、処理が開始されます。 (例)例外がスローされて終了する
3.この場合、コンテナを再起動するまで、残りの2つのメッセージは処理されません。また、最初のメッセージは未確認の状態のままです。
MessageListenerが例外をスローすると、RabbitMQリスナーはリッスンメッセージを停止します
これは予期された動作ですか?そうでない場合は、最初の処理に失敗しても、他の2つのメッセージが処理されることを確認する方法はありますか?
MQのconfiguraion:
<rabbit:connection-factory id="connectionFactory" host="localhost" username="guest" password="guest" />
<rabbit:admin connection-factory="connectionFactory" />
<rabbit:listener-container
connection-factory="connectionFactory"
concurrency="1"
acknowledge="auto">
<rabbit:listener queue-names="testQueue" ref="myProcessorListener " />
</rabbit:listener-container>
するMessageListenerクラス:
public class MyProcessorListener implements MessageListener{
....
@Override
public void onMessage(Message message) {
try{
...Some logic...
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
メッセージが再配信されるのは、私が期待しているものです。しかし、私の懸念事項は、1つのメッセージが拒否され、リスナーがキュー内の他のメッセージを処理していないことです。 – rupesh
RabbitMQは、拒否されたメッセージをキューの先頭に再キューイングするので、 'concurrency =" 1 "'しかない場合は、再処理されます(最初に拒否されます)。デフォルト(1)から 'prefetch'を増やして、拒否を受け取る前に他のメッセージを消費者に送ることもできます。 –
返信いただきありがとうございます。私はMessageListener [中のonMessage()メソッド]にブレークポイントを設定しました。最初のメッセージがピックアップされると、ブレークポイントが実行されます。その後、私は失敗を受け取り、メッセージは "Unacked"状態になります[私はRabbitMQ Consoleでチェックします]。メッセージがキューの先頭に再キューされ、再度処理されると言うと、私のブレークポイントは再び実行され、メッセージは「Unacked」状態から「ready」状態に移行するはずです。私のコードで何かが間違っているようです。私が間違っていることを教えてもらえますか? – rupesh