Uso ActiveMQ come broker per recapitare i messaggi. Questi messaggi sono intenti per essere scritti in un dabatase. A volte, il database è irraggiungibile o inattivo. In tal caso, desidero ripristinare il mio messaggio per riprovare più tardi questo messaggio e voglio continuare a leggere altri messaggi.ActiveMQ: dead letter queue mantiene l'ordine dei miei messaggi
Questo codice funziona bene, tranne un punto: il messaggio annullate da una rollback mi sta bloccando dalla lettura degli altri:
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;
}
creo la mia sessione in questo modo:
session = connection.createSession(true, Session.SESSION_TRANSACTED);
rollback è facile chiedere :
session.rollback();
Immaginiamo ho 3 messaggi nella mia coda:
1: ok
2: KO (will need to be treated again : the message I want to rollback)
3: ok
4: ok
mio consumatore farà (sequenza lineare):
commit 1
rollback 2
wait 5s
rollback 2
wait 5s
rollback 2
put 2 in dead letter queue (ActiveMQ.DLQ)
commit 3
commit 4
Ma io voglio:
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)
Quindi, come posso configurare il mio consumo di ritardare i miei messaggi annullate da una rollback più tardi?
grazie per la chiara spiegazione del comportamento. Abbiamo finalmente scelto RabbitMQ come broker e implementato il DLQ da soli. –