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