You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by "Martin Ritchie (JIRA)" <qp...@incubator.apache.org> on 2009/04/11 01:59:14 UTC

[jira] Assigned: (QPID-1642) JMS ReceiveNowait does not return a message even if the queue is not empty

     [ https://issues.apache.org/jira/browse/QPID-1642?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Martin Ritchie reassigned QPID-1642:
------------------------------------

    Assignee: Martin Ritchie  (was: Rafael H. Schloming)

> 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
>            Assignee: Martin Ritchie
>             Fix For: 0.5
>
>
> 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-subscribe@qpid.apache.org