Details
Description
Here is what I have now done.
I used Examples/Producers/SimpleProducer.cpp to put 2000 messages onto the
queue TEST.FOO.
I then ran up Examples/Consumers/SimpleAsyncConsumer.cpp in it's default
autoack mode and it consumed all 2000 messages off the queue.
I then modified it and made the following changes:
In RunConsumer
// Create a Session
/*
if( clientAck )
else
{ session = connection->createSession( Session::AUTO_ACKNOWLEDGE ); }*/
session = connection->createSession( Session::SESSION_TRANSACTED
);
This will force the session to be transactional
Then in onMessage
/*
if( clientAck )
*/
this->session->commit();
When I then run the example - if looks like the messages are processed
normally but message #1 is left on the queue.
If I run the exe a second time it outputs message #1 to standard out but
looking at the queue in jconsole the message is still there.
I can keep running the exe over and over and it outputs message#1 to stdout
but never removes it off the queue. This is the situation I'm seeing in my
own project.
For completeness I went back to autoack and the message was consumed and
removed from the queue.
The problem is the call to commit in the onMessage callback which is in the context of the dispatch thread. Calling commit here ends the transaction before the message has a chance to be added to the transaction, so the last message that you commit in the onMessage method will always be left out of the commit phase..