2017-02-23 6 views
0

コンシューマが処理を失敗し、セッションのロールバックを呼び出すと、メッセージの再配信を無効にする必要があります。目標は、メッセージを再配送せずにキュー自体に保存することです。私のバックグラウンドのコンシューマーは、メッセージを処理しようとし続けます。ActiveMQメッセージの再配信をプログラムで無効にする

connection.getRedeliveryPolicyで

()、私は、再配達の遅延やその他の設定をカスタマイズするためのオプションを参照してください、私は完全に無効に再配信する任意のオプションが表示されません。これは可能ですか(たとえば、connection.getRedeliveryPolicy()の属性をプログラムで使用するなど)。

答えて

0

残念ながら、RedeliveryPolicyを無効にする方法はありません。

多分org.apache.activemq.ActiveMQSession.INDIVIDUAL_ACKNOWLEDGEはあなたを助けるが、心の中で、この維持することができ、ここでActiveMQ redelivery does not work

を見てみましょう:ブローカが、それはディスパッチしません に消費者をメッセージのプリフェッチ制限数を派遣した後

をその消費者 に任意のより多くのメッセージが、消費者はそれを受け取ったことを、プリフェッチ メッセージ、例えば、プリフェッチ/ 2の少なくとも50%を認めているまで。ブローカーは 前記肯定応答を受信したとき、それは消費者に「トップアップ」、それがあったとして、その プリフェッチ・バッファへのメッセージのさらなるプリフェッチ/ 2 数を派遣します。コンシューマごとにプリフェッチ制限 を指定することも可能です(下記参照)。

別の解決策は、バックグラウンドの消費者のために別のキューにメッセージを送信することです。

0

さて、あなたができることはいくつかあります。

典型的な方法は、DLQ機能に組み込まれて使用し、ロールバックのメッセージがDLQに向かうようにすることです。その後、これらのメッセージを後で処理しようとするどのような手順をとってもかまいません。

しかし、あなたが本当にしていない複数回消費者に感動「されると、」キューにロールバックされたメッセージを保持したい場合は、それも実現することができます。

最初。 max redeliveresを1に設定します。つまり、メッセージは1回再試行されます。

ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
RedeliveryPolicy policy = new RedeliveryPolicy(); 
policy.setMaximumRedeliveries(1); 
cf.setRedeliveryPolicy(policy); 

次に、セレクタで再配信されないメッセージのみを受信するようにしてください。

MessageConsumer cons = sess.createConsumer(sess.createQueue("FOOBAR"), "JMSRedelivered <> true"); 

ロールバックされたメッセージを読むには、逆引きセレクタで読み取る必要があります。いずれにしても、組み込みのDLQなど、ロールバックされたメッセージに対して別のキューを使用することをお勧めします。処理がずっと簡単で、エラーが発生しにくい。

関連する問題