Have a peek at https://issues.apache.org/activemq/browse/AMQ-2710

On Wednesday, July 28, 2010, Jean-Philippe Caruana
<jeanphilippe1.caru...@orange-ftgroup.com> wrote:
> Hi,
>
> I use ActiveMQ as a broker to deliver messages. Theses messages are intented 
> to be written in a dabatase. Sometimes, the database is unreachable or down. 
> In that case, I want to rollback my message to retry later this message and I 
> want to continue reading other messages.
>
> This code works fine, except one point : the rollbacked message is blocking 
> me from reading the others :
>
>         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;
>         }
>
> I create my session this way :
>
>     session = connection.createSession(true, Session.SESSION_TRANSACTED);
>
> Rollback is easy to ask :
>
>     session.rollback();
>
> Let's imagine I have 3 messages in my queue :
>
>     1: ok
>     2: KO (will need to be treated again : the message I want to rollback)
>     3: ok
>     4: ok
>
> My consumer will do (linear sequence) :
>
>     commit 1
>     rollback 2
>     wait 5s
>     rollback 2
>     wait 5s
>     rollback 2
>     put 2 in dead letter queue (ActiveMQ.DLQ)
>     commit 3
>     commit 4
>
> But I want :
>
>     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)
>
> So, how can I configure my Consumer to delay my rollbacked messages later ?
> ********************************
> Ce message et toutes les pieces jointes (ci-apres le "message") sont
> confidentiels et etablis a l'attention exclusive de ses destinataires.
> Toute utilisation ou diffusion non autorisee est interdite.
> Tout message electronique est susceptible d'alteration. Multimedia Business 
> Services decline
> toute responsabilite au titre de ce message s'il a ete altere, deforme
> ou falsifie.
> Si vous n'etes pas destinataire de ce message, merci de le detruire
> immediatement et d'avertir l'expediteur.
> *********************************
> This message and any attachments (the "message") are confidential and
> intended solely for the addressees. Any unauthorised use or
> dissemination is prohibited.
> Messages are susceptible to alteration. Multimedia Business Services shall 
> not be liable for the
> message if altered, changed or falsified.
> If you are not the intended addressee of this message, please cancel it
> immediately and inform the sender..
> ********************************
>

-- 
http://blog.garytully.com

Open Source Integration
http://fusesource.com

Reply via email to