JMS ReceiveNowait does not return a message even if the queue is not empty
--------------------------------------------------------------------------

                 Key: QPID-1642
                 URL: https://issues.apache.org/jira/browse/QPID-1642
             Project: Qpid
          Issue Type: Bug
          Components: Java Client
    Affects Versions: M4
            Reporter: Arnaud Simon
             Fix For: M5


Description:
The first invocation of receiveNoWait does not return a message even if the 
queue is full. 
How to replicate:
1) create a queue 
2) send a message 
3) try to consume this message using receiveNoWait 
==> we get null even if there is a message seating in the queue 
Solution:
When a JMS consumer first invokes receiveNowait then BasicMessageConsumer_0_10 
request for more credits and then poll the _synchronousQueue. This does not 
leave enough time for the message to be enqueued. 
One solution would be to query the queue size before allowing the credits: 
Something like that would work: 
public Object getMessageFromQueue(long l) throws InterruptedException
    {
        long size = 0;
        if(l < 0)
        {
               size =  _0_10session.requestQueueDepth(getDestination()) ;
        }
        if (isStrated() && ! getSession().prefetch() && 
_synchronousQueue.isEmpty())
        {
            _0_10session.getQpidSession().messageFlow(getConsumerTagString(),
                                                      
MessageCreditUnit.MESSAGE, 1);
        }
        if (! getSession().prefetch())
        {
            _syncReceive.set(true);
        }
        Object o;// = super.getMessageFromQueue(l);
        if (l > 0)
         {
             o = _synchronousQueue.poll(l, TimeUnit.MILLISECONDS);
         }
         else if (l < 0)
         {           
              if(size <= 0 )
              {
                 o = _synchronousQueue.poll();
              }
              else
              {
                 o = _synchronousQueue.take();
              }
         }
         else
         {
             o = _synchronousQueue.take();
         }
        if (! getSession().prefetch())
        {
            _syncReceive.set(false);
        }
        return o;
    }


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:dev-subscr...@qpid.apache.org

Reply via email to