2

我们使用 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;
    }

更新:

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

4

1 回答 1

0

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

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

于 2013-05-13T21:45:06.833 回答