* or null if one is not immediately available. Returns null if the consumer is
* concurrently closed.
*/
public MessageProxy receive(long timeout) throws JMSException
{
MessageProxy m = null;
synchronized (mainLock)
{
if (trace) { log.trace(this + " receiving, timeout = " + timeout); }
if (closed)
{
// If consumer is closed or closing calling receive returns null
if (trace) { log.trace(this + " closed, returning null"); }
return null;
}
if (listener != null)
{
throw new JMSException("The consumer has a MessageListener set, " +
"cannot call receive(..)");
}
receiverThread = Thread.currentThread();
long startTimestamp = System.currentTimeMillis();
try
{
while(true)
{
if (timeout == 0)
{
if (trace) { log.trace(this + ": receive, no timeout"); }
m = getMessage(0);
if (m == null)
{
return null;
}
}
else if (timeout == -1)
{
//ReceiveNoWait
if (trace) { log.trace(this + ": receive, noWait"); }
m = getMessage(-1);
if (m == null)
{
if (trace) { log.trace(this + ": no message available"); }
return null;
}
}
else
{
if (trace) { log.trace(this + ": receive, timeout " + timeout + " ms, blocking poll on queue"); }
m = getMessage(timeout);
if (m == null)
{
// timeout expired
if (trace) { log.trace(this + ": " + timeout + " ms timeout expired"); }
return null;
}
}
if (trace) { log.trace(this + " received " + m + " after being blocked on buffer"); }
boolean ignore =
checkExpiredOrReachedMaxdeliveries(m, sessionDelegate, maxDeliveries);
if (!isConnectionConsumer && !ignore)
{
DeliveryInfo info = new DeliveryInfo(m, consumerID, queueName, null);
m.incDeliveryCount();
sessionDelegate.preDeliver(info);
sessionDelegate.postDeliver();
}