J'utilise ActiveMQ comme courtier pour livrer des messages. Ces messages sont destinés à être écrits dans une dabatase. Parfois, la base de données est inaccessible ou inaccessible. Dans ce cas, je veux annuler mon message pour réessayer plus tard ce message et je souhaite continuer à lire les autres messages.ActiveMQ: la file d'attente des lettres mortes permet de garder l'ordre de mes messages
Ce code fonctionne très bien, sauf un point: le message rollbacked me bloque à la lecture des autres:
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;
}
Je crée ma session ainsi:
session = connection.createSession(true, Session.SESSION_TRANSACTED);
Rollback est facile de demander :
session.rollback();
Imaginons que j'ai 3 messages dans ma file d'attente:
1: ok
2: KO (will need to be treated again : the message I want to rollback)
3: ok
4: ok
Mon consommateur fera (séquence linéaire):
commit 1
rollback 2
wait 5s
rollback 2
wait 5s
rollback 2
put 2 in dead letter queue (ActiveMQ.DLQ)
commit 3
commit 4
Mais je veux:
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)
Alors, comment puis-je configurer mon consommateur pour retarder mes messages rollbacked plus tard?
merci pour l'explication claire du comportement. Nous avons finalement choisi RabbitMQ comme courtier et implémenté le DLQ par nous-mêmes. –