brokeredmessage微软服务总线队列ReceiveBatch没有获得所有死信消息

时间:2015-03-11 13:54:19

标签: c# azure queue azure-servicebus-queues brokeredmessage

我正在使用Microsoft Service Bus测试一个带死信队列的项目。我发送了26条消息(代表字母表),我使用的程序在接收消息时,将其中的一些随机地放入死信队列中。消息总是从死信队列中以偷看模式读取,所以一旦到达那里,他们就会留在那里。运行几次后,所有26条消息都将在死信队列中,并始终保留在那里。

然而,在阅读它们时,有时只读取少数(例如6个),有时全部26个。

我使用命令:

const int maxToRead = 200; // It seems one wants to set this higher than    
                          // the anticipated load, obtaining only some back
IEnumerable<BrokeredMessage> dlIE = 
            deadletterSubscriptionClient.ReceiveBatch(maxToRead);

ReceiveBatch有一个超时,它有一个超时,但这没有帮助,并且可能只会增加复杂性。

为什么每次都不能获得所有26条消息,因为它用于&#34; peek&#34;模式和消息留在那里。

我可以使用&#34; Service Bus Explorer&#34;实际验证所有消息都在deadletter队列中并保留在那里。

这主要是一个测试示例,但人们希望&#34; ReceiveBatch&#34;将以确定性模式工作,而不是以非常(差)随机的方式......

1 个答案:

答案 0 :(得分:0)

这只是部分答案或解决方法;以下代码可靠地获取所有元素,但不使用“ReceiveBatch”;请注意,据我所知,Peek(i)以单一指数运作。另外:根据运行的服务器,如果您通过消息提取费用,这可能(或可能不)更昂贵,因此使用风险自负:

            List<BrokeredMessage> dlIE = new List<BrokeredMessage>();

            BrokeredMessage potentialMessage = null;
            int loopCount = 1;
            while ((potentialMessage = deadletterSubscriptionClient.Peek(loopCount)) != null)
            {
                dlIE.Add(potentialMessage);
                loopCount++;
            }