Azure服务总线队列PeekBatch锁定?

我在QueueClient (Windows Azure Service Bus包版本2.1.2.0)上使用PeekBatch()方法。

它第一次工作正常,并返回我的队列中存在的单个消息,但后续调用什么都不返回。 五分钟后,呼叫将再次返回消息。

五分钟是BrokeredMessage上的最大锁定时间,所以我想知道PeekBatch是否实际上像接收那样锁定那些消息,即使偷看不应该锁定,据我所知。

我正在尝试构建一个MVC视图,以便能够看到我的队列中实际存在的内容,但是这个视图正在阻碍。 任何人都可以就此提供任何指导吗?

更新 :当我使用静态属性缓存QueueClient时,似乎只会发生这种情况。 如果我每次都创建新的QueueClientPeekBatch将按预期工作。 我仍然不知道为什么重用QueueClient会导致这种情况。 微软似乎建议重用QueueClient ,而不是每次都重新创建它,所以我仍然在这里不知所措。

QueueClient有点帮助。 在Peek方法(Peek和PeekBatch)中,您可以简单地调用它们,或者您可以给出特定的序列号以在特定序列号之后检索特定消息。 如果您只是调用Peek,或者在您的情况下PeekBatch,没有序列号,那么它将检索队列中的第一条消息或消息。 返回消息后,QueueClient会跟踪它提取的最后一个序列号。 随后对Peek的每次调用都将获取队列中的下一条消息。 这个想法是你每次都“浏览”消息而不只是对队列中的第一条消息感兴趣。

所以,如果你在循环中并反复调用peek,直到它没有返回消息,你基本上已经浏览了队列中的所有消息。

由于您在没有序列号的情况下调用PeekBatch,QueueClient正在记住它获得的最后一个集,然后下一个调用实际上会尝试在它浏览的最后一条消息之后获取下一个集。 这就是为什么当您重新创建QueueClient时,它似乎重置。 它似乎在5分钟后重置它自己的原因似乎很奇怪,但它可能只是在与队列上的Timeout操作相关的某个点之后清除浏览值。 到那时,如果它是一个忙碌的队列,序列号无论如何都会相当远。

如果您只需要查看第一条消息,请只调用一次peek。 它只会返回第一条消息。 如果您需要每次执行Peek(0)时不断拉出第一条消息。 如果你想每次首先说10条消息,那么调用PeekBatch(0,10); 这就像说给出前十条序列号大于0的消息。

重用QueueClient的指导是合理的。 它正在进行各种信息和事物的缓存。 您不希望每次都重新创建它。