質問

メッセージを配信するブローカーとして ActiveMQ を使用します。これらのメッセージは、データベースで書かれることを目的としています。場合によっては、データベースにアクセスできないかダウンしていることがあります。その場合、メッセージをロールバックして後でこのメッセージを再試行し、他のメッセージを読み続けたいと考えています。

このコードは 1 点を除いて正常に動作します。ロールバックされたメッセージにより、他のメッセージを読むことができなくなります。

private Connection getConnection() throws JMSException {
    RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
    redeliveryPolicy.setMaximumRedeliveries(3); // will retry 3 times to dequeue rollbacked messages
    redeliveryPolicy.setInitialRedeliveryDelay(5 *1000);  // will wait 5s to read that message

    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, password, url);
    Connection connection = connectionFactory.createConnection();
    ((ActiveMQConnection)connection).setUseAsyncSend(true);
    ((ActiveMQConnection)connection).setDispatchAsync(true);
    ((ActiveMQConnection)connection).setRedeliveryPolicy(redeliveryPolicy);
    ((ActiveMQConnection)connection).setStatsEnabled(true);
    connection.setClientID("myClientID");
    return connection;
}

私は次のようにしてセッションを作成します。

session = connection.createSession(true, Session.SESSION_TRANSACTED);

ロールバックを尋ねるのは簡単です:

session.rollback();

キューに 3 つのメッセージがあると想像してみましょう。

1: ok
2: KO (will need to be treated again : the message I want to rollback)
3: ok
4: ok

私の消費者は次のようにします (線形シーケンス):

commit 1 
rollback 2
wait 5s
rollback 2
wait 5s
rollback 2
put 2 in dead letter queue (ActiveMQ.DLQ)
commit 3
commit 4

でも私はしたい :

commit 1
rollback 2
commit 3
commit 4
wait 5s
rollback 2
wait 5s
rollback 2
wait 5s
put 2 in dead letter queue (ActiveMQ.DLQ)

では、ロールバックされたメッセージを後で遅らせるようにコンシューマーを構成するにはどうすればよいでしょうか?

役に立ちましたか?

解決

これは実際には予想される動作であり、メッセージの再試行はブローカーではなくクライアントによって処理されます。したがって、1つのセッションバインドがあるため、DLQの前に3回の再試行のためにリトライポリシーが設定されているので、再試行プロセス全体がその特定のスレッドをブロックします。

だから、私の最初の質問は、データベースの挿入が失敗した場合、あなたのDB挿入の残りのすべてのすべてが同様の理由で失敗すると思いますか。

そうでない場合、そのキューの再試行ポリシーを特定のDLQで0回転させるように設定する方法は、メッセージがすぐに失敗し、DLQに入ります。次に、5秒ごとにDLQを引き下げて再処理したり、処理のためにメイン・キューに戻したりするもう1つのプロセスがあります。

他のヒント

を使用していますか <strictOrderDispatchPolicy /> ActiveMQ XML 構成ファイル内にありますか?これが再配信のメッセージの順序に影響するかどうかはわかりません。厳密な注文ディスパッチを使用している場合は、そのポリシーをコメントアウトして、動作が変わるかどうかを確認してください。

ブルース

私は同じ問題を抱えていました、私はここで解決策を見つけていないので、私が同じことに苦しんでいる人々のためにそれを見つけた後にここに投稿することにしました。 これはバージョン5.6の前に固定されています。

を使用してProperty NonBlockingReadeliveryをTrueに設定します。
<property name="nonBlockingRedelivery" value="true" />
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top