2017-11-08 2 views
0

私はスプリングブートAMQPライブラリを使用して、スプリングブートアプリケーションを用意しています。Spring-Boot/AMQP - 処理されるメッセージの上限数

のpom.xml

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-amqp</artifactId> 
</dependency> 

は、どのように私はそれが終了優雅にそして単一メッセージを処理し、承認することができますか?

通知なしで終了することはできますが、メッセージを確認してから終了する方法がうまくいかないようです。

+0

メッセージを1つだけ処理して処理したいですか?キューに100個のメッセージがある場合はどうなりますか? –

+0

@DarshanMehtaはいキューに100個のメッセージがあっても、単一のメッセージを処理して終了したいと思います。 – ManseUK

+0

あなたはこれと同様のアプローチを使用することができます:https://stackoverflow.com/questions/41035454/how-to-stop-consuming-messages-with-rabbitlistener。 「AtomicInteger」を追加し、カウントが1に達すると消費を停止する可能性がありますか? ackに関しては、 'listener'メソッドが正常に終了すると、Springはackを送信します。あなたが 'stop()'を呼び出すと、それは肯定的ではないので、他のユーザがメッセージを利用できるようになります。 –

答えて

1

リスナーコンテナを使用する代わりに、RabbitTemplate.receive()(またはreceiveAndConvert())のいずれかのメソッドを使用するだけです。

+0

これは消費者がメッセージを聞いてくるのではなく、リクエストに基づいてメッセージを聞き取ることです - いいアイデア – ManseUK

+0

はい、まさにそうです。それがオンデマンドで消費する最も簡単な方法です。 –

1

あなたは、以下の手順に従うことができます:

  • 使用SpringのRabbitListenerリスナーとして
  • は、一度、あなたのリスナークラス
  • インクリメントカウンタにカウンタとしてAtomicIntegerを宣言します(完全例えばthis SO answerを参照してください)あなたはメッセージを聞きます(つまり、listenメソッドは例外なしで実行されます)。カウンタの値を超える0(または設定された閾値以上)であれば、メソッドが正常に
  • を実行する際の春はACKのみを送信します、しきい値を設定し、incrementAndget()を使用するstop()方法
  • 使用@Valueを呼び出すことにより、リスニングを停止カウンタをアトミックにインクリメントする方法
関連する問題