メッセージを配信するためのブローカーとして 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 を構成するにはどうすればよいでしょうか?