Azure 服务总线队列 PeekBatch 锁定?

11
我正在使用QueueClient(Windows Azure Service Bus包版本2.1.2.0)上的PeekBatch(<messageCount>)方法。第一次它可以很好地工作并返回我队列中存在的单个消息,但是随后的调用却没有返回任何内容。五分钟后,该调用会再次返回该消息。
因为五分钟是BrokeredMessage的最长锁定时间,所以我想知道PeekBatch是否实际上像在接收时一样锁定了这些消息,尽管根据我所知,预览不应该锁定。
我正在尝试构建一个MVC视图来查看实际上在我的队列中等待的内容,但是这个问题正在妨碍我。有人能够提供任何关于此的指导吗?
更新:只有在使用静态属性缓存我的QueueClient时才会发生这种情况。如果每次都新创建QueueClient,则PeekBatch如预期般工作。我仍然不知道为什么重用QueueClient会导致这种情况。然而,Microsoft似乎建议重用QueueClient,而不是每次重新创建,所以我还是很困惑。
1个回答

21
QueueClient 是个有用的工具。在 Peek 方法(Peek 和 PeekBatch)中,你可以直接调用它们,或者给它一个特定的队列序列号来检索特定序列号后的消息,如果你没有指定序列号调用 Peek 或者在你的情况下是 PeekBatch,则会检索队列中的第一条或多条消息。一旦消息返回,QueueClient 将跟踪它拉取的最后序列号。每次对 Peek 的后续调用将获取队列中的下一条消息。这样做的想法是你正在“浏览”消息,而不仅仅是每次都对队列中的第一条消息感兴趣。
所以,如果你处于循环中并重复调用 peek 直到它不返回消息,那么你将浏览队列中的所有消息。
由于你没有给 PeekBatch 指定序列号,QueueClient 记住了最后一组消息,然后下一次调用实际上会尝试在浏览的最后一条消息之后获取下一组消息。这就是为什么当你重新创建 QueueClient 时它似乎会重置的原因。它自己在 5 分钟后看起来重置似乎很奇怪,但这可能只是在与队列的超时操作相关的某些时间点之后清除了浏览值。如果队列很忙,则此时序列号可能已经相当偏离。
如果你只需要查看第一条消息,那么只需调用 Peek 一次即可,它将只返回第一条消息。如果你每次都需要连续获取第一条消息,请调用 Peek(0)。如果你想每次获取前 10 条消息,则调用 PeekBatch(0, 10); 这将类似于说“给我大于 0 的前十条消息”。
重复使用 QueueClient 是正确的建议,因为它正在缓存各种信息和事物。你不想每次都重新创建它。

1
太棒了!这个答案正如你所描述的那样有效,现在我真希望我早就尝试过传递零参数了。:) MSDN文档应该为peek方法提供更多信息。也许我会尝试在那里添加评论。 - Michael
老旧但相当有效 :) 今天救了我的命! - camous
1
这个答案对于启用分区的队列也适用吗? - Deepak
如果指定序列号为0,它是否会查看前10条消息或前10条未锁定的消息。这很重要,因为如果QueueClients被缓存并且它们记住了最后一个序列号,它们可能会错过已锁定但稍后被放弃的消息(即缓存的客户端永远不会重新访问那些被放弃的消息)。 - Triynko
为了回答我自己的问题,peek是一种诊断工具,可以返回所有状态中的所有消息,包括锁定状态。然而,仍然不清楚的是Mohan问的问题。对于分区队列,它的行为如何?既然它可能返回一个不是最低整体的消息,那么当完成第一个分区返回时,它去哪里了?客户端是否跟踪它访问过哪个分区? - Triynko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接