Azure 服务总线MessageSession已接受,但Receive返回null

Azure 服务总线MessageSession已接受,但Receive返回null,azure,azureservicebus,azure-servicebus-queues,Azure,Azureservicebus,Azure Servicebus Queues,我们使用Azure服务总线队列,并使用AcceptMessageSession(下面的代码)接收消息 接受MessageSession成功,但当我调用MessageSession上的Receive时,返回null 这种情况并非总是发生,而是在创建队列一段时间后发生。发生这种情况时,我验证了队列不是空的。 当我关闭MessageSession时,我看到我的队列缩短(消息数量正确!),但我没有收到我的消息 我使用的代码是: public IEnumerable<T> ReceiveBat

我们使用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;
    }
public IEnumerable ReceiveBatch(TimeSpan waitTime)
{
MessageSessionReceiver=null;
可数返回;
QueueClient=GetQueueClient();
尝试
{
sessionReceiver=queueClient.AcceptMessageSession(waitTime);
retval=ReceiveSessionMessages(sessionReceiver);
}
最后
{
if(sessionReceiver!=null)sessionReceiver.Close();
}
返回返回;
}
私有IEnumerable ReceiveSessionMessages(MessageSession receiver)
{
receiver.PrefetchCount=10;
代理消息;
var retval=新列表();
而((message=receiver.Receive())!=null)
{
var item=message.GetBody();
如果(!等于(项,默认值(T)),则返回添加(项);
}
返回返回;
}
更新:


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

< p> >这里考虑的两个项目,您正在使用<代码>预取计数> /代码>进行隐式批处理,相反,您可以使用
receiveBatch
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;
        }
private IEnumerable ReceiveSessionMessages(MessageSession receiver)
{
var retval=新列表();
var消息=接收方接收批次(10);
foreach(消息中的BrokeredMessage消息)
{
var item=message.GetBody();
如果(!等于(项,默认值(T)),则返回添加(项);
}
返回返回;
}

同样,如果您收到
消息会话
,但没有消息可以详细说明它们是否已过期?您是否设置了
TimeToLive
值,或者在到达
MaxDeliveryCount
后消息会变成死信

感谢您的建议,我最初确实使用了ReceiveBatch,但它的工作原理并不完全相同(我们的系统没有预回迁计数集)。TTL不是问题所在,死信已关闭,并且只有一个接收器..您是否确保在GetBody调用中没有抛出错误等。?