【问题标题】:Service Bus MessageSession accepted but Receive returns null服务总线 MessageSession 已接受,但 Receive 返回 null
【发布时间】:2013-05-13 09:32:24
【问题描述】:

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

更新:

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

【问题讨论】:

    标签: azure azureservicebus azure-servicebus-queues


    【解决方案1】:

    这里需要考虑几个项目,您正在使用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 后消息被死信。

    【讨论】:

    • 感谢您的建议,我最初确实使用了 RecieveBatch,但效果不一样(我们没有设置 PrefetchCount)。 TTL 不是问题,deadlettering 被关闭并且只有一个接收器..
    • 您是否确保在 GetBody 调用等中没有抛出错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多