Service Bus MessageSession已接受但Receive返回null

时间:2013-05-13 09:32:25

标签: azure azureservicebus azure-servicebus-queues

我们使用Azure服务总线队列,并使用AcceptMessageSession(下面的代码)接收消息。

接受MessageSession成功,但是当我在MessageSession上调用Receive时,返回null。

这并不是一直发生的,而是在创建队列后的一段时间内发生的。当发生这种情况时,我确认队列不是空的。 当我关闭MessageSession时,我看到我的队列缩短了(正确的消息数量!)但我没有收到我的消息......

我使用的代码:

public IEnumerable<T> ReceiveBatch<T>(TimeSpan waitTime)
    {
        MessageSession sessionReceiver = null;
        IEnumerable<T> retval;

        QueueClient queueClient = GetQueueClient<T>();

        try
        {
            sessionReceiver = queueClient.AcceptMessageSession(waitTime);
            retval = ReceiveSessionMessages<T>(sessionReceiver);
        }
        finally
        {
            if (sessionReceiver != null) sessionReceiver.Close();
        }

        return retval;
    }

    private IEnumerable<T> ReceiveSessionMessages<T>(MessageSession receiver)
    {
        receiver.PrefetchCount = 10;

        BrokeredMessage message;
        var retval = new List<T>();
        while ((message = receiver.Receive()) != null)
        {
             var item = message.GetBody<T>();
             if (!Equals(item, default(T))) retval.Add(item);
        }

        return retval;
    }

更新:

我怀疑虽然某个会话的所有消息都已过期,但会话本身仍然存在,因此它被接受但没有收到任何消息。

1 个答案:

答案 0 :(得分:0)

这里要考虑的几个项目,您使用PrefetchCount进行隐式批处理,而您可以使用RecieveBatch API显式获取一组消息。请参阅下面的代码示例

private IEnumerable<T> ReceiveSessionMessages<T>(MessageSession receiver)
        {
            var retval = new List<T>();
            var messages = receiver.ReceiveBatch(10);
            foreach(BrokeredMessage message in messages)
            {
                var item = message.GetBody<T>();
                if (!Equals(item, default(T))) retval.Add(item);
            }

            return retval;
        }

同样在你得到MessageSession但没有消息的情况下,你可以详细说明它们是否已经过期了吗?您是否设置了TimeToLive值,或者在达到MaxDeliveryCount后消息会被破坏。