0

Spring AMQPを使用している場合、RabbitMQチャンネルでbasicAckのIOExceptionを正しく処理する方法は?春AMQPを使用して、このようなメソッドを宣言した

@RabbitListener(..)  
public void myMethod(@Header(AmqpHeaders.CHANNEL) Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) Long tag, ...) 

やマニュアルを使用するにはどのように1が正常にACKをやったときにスローされる可能性がありIOExceptionに対処する必要があり、確認応答モード:

try { 
    channel.basicAck(tag, false); 
} catch (IOException e) { 
    // What to do here? 
} 

がすべき例外は再スローされますか? 「basicAck」操作を再試行する必要がありますか?それを処理する適切な方法は何ですか?

答えて

3

これを行う標準的な方法は、いずれも成功しない場合に再試行のメカニズム&を使用することです。

しかし、私の経験に基づいて、チャンネルが例外をスローすると、多かれ少なかれチャンネルが役に立たないということを意味します。&もう一度やり直す必要があるかもしれません。私は通常、必要な詳細とともにエラーをログに記録し、どのメッセージ処理が失敗したのかを追跡して、後で同じことを確認して処理されているかどうかを確認できるようにします。

+0

「すべてをやり直す」と言うと、それは本質的に私がしたいことです。しかし、私は、ACKとNACKのどちらもRabbitMQに届かず、メッセージが "unack:ed"状態であり、アプリケーションが再起動されるまでSpringによって再度再調査されないことを心配しています。 – Johan

+1

何らかの理由でチャネルが閉じられている可能性があります。この場合、メッセージは自動的に準備完了に戻り、再配信されます。 'try {close} ... 'を追加して確実にすることもできますが、それも失敗する可能性があります。あなたのメソッドはすでにいくつかの他の状態を更新している可能性があるので、重複した配信に対処する必要があります。 –

関連する問題