6

メッセージを配信するためのブローカーとして 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)

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

4

3 に答える 3

8

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

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

そうでない場合、メッセージがすぐに失敗して DLQ に送られるように、そのキューの再試行ポリシーを特定の DLQ で 0 再試行に設定することで回避できます。次に、5 秒ごとに DLQ をプルオフし、再処理するか、処理のためにメイン キューに戻す別のプロセスを用意します。

于 2011-03-18T18:39:20.837 に答える
0

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

ブルース

于 2010-07-13T16:59:34.120 に答える
0

私は同じ問題を抱えていました。ここで解決策が見つからなかったので、同じ問題に苦しんでいる人のために解決策を見つけた後、ここに投稿することにしました. これは、接続ファクトリでプロパティ nonBlockingRedelivery を true に設定すると、バージョン 5.6 より前に修正されます。

<property name="nonBlockingRedelivery" value="true" />
于 2014-02-25T14:08:12.403 に答える