11

我正在使用(Windows Azure 服务总线包版本 2.1.2.0) PeekBatch(<messageCount>)上的方法。QueueClient

它第一次运行良好,并返回队列中存在的单个消息,但后续调用什么也不返回。五分钟后,呼叫将再次返回消息。

五分钟是 a 上的最长锁定时间BrokeredMessage,所以我想知道是否PeekBatch真的像在接收上那样锁定这些消息,尽管据我所知,偷看不应该锁定。

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

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

4

1 回答 1

21

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

因此,如果您处于循环中并反复调用 peek 直到它没有返回消息,那么您实际上已经浏览了队列中的所有消息。

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

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

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

于 2013-08-30T02:11:34.787 回答