On Tue, Oct 28, 2008 at 05:44:26PM +0000, James Strachan wrote:
> 2008/10/28 Eugeny N Dzhurinsky <[EMAIL PROTECTED]>:
> > Hello!
> >
> > I am facing some strange issue with acknowledge mode in ActiveMQ. After
> > reading the specs, I realized the broker will never deliver a message to the
> > consumer unless the consumer acknowledges the previous message. So I thought
> > it is enough to not send the acknowledgement message to the server in the
> > onMessage method of the consumer and sent it later from another thread, 
> > which
> > does it's job. This means I spawn a thread when onMessage is called and 
> > forget
> > about it in this method.
> You should only be using a JMS session from one thread at once - so
> you should call message.acknowlege() from the consumer thread.

   final MessageConsumer consumer = serverSession
           .createConsumer(serverQueue);
   consumer.setMessageListener(new MessageListener() {

       public void onMessage(final Message message) {
           System.out.println("Got message");
           try {
               System.out.println(message.getStringProperty(DATA));
               // message.acknowledge();
               successCount.incrementAndGet();
           } catch (final Exception e) {
               e.printStackTrace();
           }
       }

   });

Calling or not calling acknowledge doesn't make any difference - as soon as
onMessage returns, the next message is delivered to the consumer.

> If you don't want the message broker to send another message to the
> consumer until it is acknowledged, set prefetch to 1
> http://activemq.apache.org/what-is-the-prefetch-limit-for.html

   private static final String CONNECTION_URL = 
"vm://localhost?broker.persistent=false&jms.prefetchPolicy.all=1";

I am doing in this way, as can be found in the source I originally posted.

So is there a bug in ActiveMQ regarding the acknowledge mode or I still
missing something?

-- 
Eugene N Dzhurinsky

Attachment: pgpyP391n9XIE.pgp
Description: PGP signature

Reply via email to