Azure 队列检查消息数

Azure queue check number of messages

为了进行集成检查,我想计算 Azure 队列中的消息数。该方法如下所示:

internal void VerifyMessagesOnQueue(string queueNameKey, int expectedNumberOfMessages)
{
    var azureStorageConnectionKey = ConfigurationManager.AppSettings["AzureStorageConnectionKey"];
    var storageAccount = CloudStorageAccount.Parse(azureStorageConnectionKey);
    var queueClient = storageAccount.CreateCloudQueueClient();
    var queue = queueClient.GetQueueReference(ConfigurationManager.AppSettings[queueNameKey]);
    var messages = queue.PeekMessages(int.MaxValue);
    messages.Count().Should().Be(expectedNumberOfMessages);
}

现在我正在使用 var messages = queue.PeekMessages(int.MaxValue); 来尝试获取队列中的所有消息。它 returns 一个 HTML 响应 400。我试过 var messages = queue.PeekMessages(expectedNumberOfMessages);,但是当 expectedNumberOfMessages 为 0 时,我也得到一个 HTML 响应 400。

如何在不中断 Azure 队列的情况下可靠地检查消息数量(这就是我使用 .PeekMessage 的原因)?

I want to count the number of messages on an Azure queue

我建议您可以尝试使用以下代码来实现您的目标。我已经创建了一个控制台项目来测试。

App.config 中的 StorageConnectionString:

<appSettings>
    <add key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=×××;AccountKey=×××" />
</appSettings>

Program.cs中的代码:

 static void Main(string[] args)
        {
            string Queue_Name = "myqueue";
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    Microsoft.Azure.CloudConfigurationManager.GetSetting("StorageConnectionString"));
            CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();           
            CloudQueue queue = queueClient.GetQueueReference(Queue_Name);
            queue.FetchAttributes();
            var count=queue.ApproximateMessageCount;
            Console.WriteLine("message number in queue:"+count);
        }

关于队列计数的结果:

Janley Zhang 的回答是正确的。要获得队列中的近似消息数,您需要获取队列的属性。添加新答案以澄清以下内容:

Right now I'm using var messages = queue.PeekMessages(int.MaxValue); to try to get all the messages on a queue. It returns an HTML repsonse 400. I have tried var messages = queue.PeekMessages(expectedNumberOfMessages);, but when expectedNumberOfMessages is 0, I also get an HTML response 400.

本质上 PeekMessages 用于从队列顶部检索消息而不改变检索消息的可见性。

单个请求中可从队列中提取的最大消息数为 32,最小为 1。请查看此 link(URI 参数部分)了解更多详细信息。

在这两种情况下,您指定的计数超出了允许的范围 (1 - 32),这就是您从队列中返回 400 错误的原因。