我在PeekBatch(<messageCount>)
上使用QueueClient
方法(Windows Azure Service Bus软件包版本2.1.2.0)。
第一次运行正常,并返回我队列中存在的单个消息,但后续调用什么都不返回。五分钟后,呼叫将再次返回消息。
五分钟是BrokeredMessage
上的最长锁定时间,所以我想知道PeekBatch
是否实际锁定了这些消息,就像它在接收上一样,即使偷看不应该锁定,只要我知道。
我正在尝试构建一个MVC视图,以便能够看到我的队列中实际存在的内容,但是这个视图正在阻碍。任何人都可以就此提供任何指导吗?
更新:当我使用静态属性缓存QueueClient
时,似乎只会发生这种情况。如果我每次都创建QueueClient
新鲜,PeekBatch
按预期工作。我仍然不知道为什么重用QueueClient
会导致这种情况。 Microsoft seems to recommend reusing the QueueClient
though,而不是每次都重新创建它,所以我仍然在这里不知所措。
答案 0 :(得分:15)
QueueClient有点帮助。在Peek方法(Peek和PeekBatch)中,您可以简单地调用它们,或者您可以给出特定的序列号以在特定序列号之后检索特定消息。如果您只是调用Peek,或者在您的情况下PeekBatch,没有序列号,那么它将检索队列中的第一条消息或消息。返回消息后,QueueClient会跟踪它提取的最后一个序列号。对Peek的每次后续调用都将获取队列中的下一条消息。我们的想法是,您正在“浏览”消息,而不是每次只对队列中的第一条消息感兴趣。
所以,如果你在循环中并反复调用peek,直到它没有返回消息,你基本上已经浏览了队列中的所有消息。
由于您在没有序列号的情况下调用PeekBatch,QueueClient正在记住它获得的最后一个集合,然后下一个调用实际上会尝试在它浏览的最后一条消息之后获取下一个集合。这就是为什么当您重新创建QueueClient时,它似乎重置。它似乎在5分钟后自行重置的原因看起来很奇怪,但它可能只是在与队列上的Timeout操作相关的某个点之后清除浏览值。到那时,如果它是一个忙碌的队列,序列号就会相当远。
如果您只需要查看第一条消息,请只调用一次peek。它只会返回第一条消息。如果您需要每次执行Peek(0)时不断拉出第一条消息。如果你想每次首先说10条消息,那么调用PeekBatch(0,10);这就像说给我前10条序列号大于0的消息。
重用QueueClient的指导是合理的。它正在进行各种信息和事物的缓存。您不希望每次都重新创建它。