2017-04-18 11 views
0

私は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

メッセージが何度も何度も再配信されています。それを拒否する(およびデッド・レター・キューへの廃棄またはルーティング)ためには、AmqpRejectAndDontRequeueExceptionを投げるか、コンテナのrequeue-rejectedプロパティをfalseに設定する必要があります。 Javaで設定する場合はdefaultRequeueRejectedです。

カスタムエラーハンドラを使用することもできます。

これはすべてexplained in the reference manualです。

+0

メッセージが再配信されるのは、私が期待しているものです。しかし、私の懸念事項は、1つのメッセージが拒否され、リスナーがキュー内の他のメッセージを処理していないことです。 – rupesh

+0

RabbitMQは、拒否されたメッセージをキューの先頭に再キューイングするので、 'concurrency =" 1 "'しかない場合は、再処理されます(最初に拒否されます)。デフォルト(1)から 'prefetch'を増やして、拒否を受け取る前に他のメッセージを消費者に送ることもできます。 –

+0

返信いただきありがとうございます。私はMessageListener [中のonMessage()メソッド]にブレークポイントを設定しました。最初のメッセージがピックアップされると、ブレークポイントが実行されます。その後、私は失敗を受け取り、メッセージは "Unacked"状態になります[私はRabbitMQ Consoleでチェックします]。メッセージがキューの先頭に再キューされ、再度処理されると言うと、私のブレークポイントは再び実行され、メッセージは「Unacked」状態から「ready」状態に移行するはずです。私のコードで何かが間違っているようです。私が間違っていることを教えてもらえますか? – rupesh

関連する問題