Я использую ActiveMQ в качестве брокера для доставки сообщений. Эти сообщения предназначены для написания в dabatase. Иногда база данных недоступна или недоступна. В этом случае я хочу откатить свое сообщение, чтобы позже повторить попытку и продолжить чтение других сообщений.
Этот код работает нормально, за исключением одного момента: откатное сообщение не позволяет мне прочесть остальные:
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)
Итак, как я могу настроить моего Потребителя так, чтобы позже откладывать откатанные сообщения?