Uploaded image for project: 'ActiveMQ C++ Client'
  1. ActiveMQ C++ Client
  2. AMQCPP-195

Message stuck in queue when using transactional sessions

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 2.2
    • 2.2.1
    • CMS Impl, Openwire
    • None
    • ActiveMQ-CPP 2.2 with ActiveMQ 5.1 Broker.

    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 )

      { session = connection->createSession( Session::CLIENT_ACKNOWLEDGE ); }

      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 )

      { message->acknowledge(); }

      */
      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.

      Attachments

        Activity

          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..

          tabish Timothy A. Bish added a comment - 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..

          Resolved in SVN 688553

          tabish Timothy A. Bish added a comment - Resolved in SVN 688553

          People

            tabish Timothy A. Bish
            tabish Timothy A. Bish
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: