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:[email protected]