【问题标题】:Azure queue check number of messagesAzure 队列检查消息数
【发布时间】:2018-08-26 01:31:16
【问题描述】:

为了进行集成检查,我想计算 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); 尝试获取队列中的所有消息。它返回一个 HTML 响应 400。我试过 var messages = queue.PeekMessages(expectedNumberOfMessages);,但是当 expectedNumberOfMessages 为 0 时,我也得到一个 HTML 响应 400。

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

【问题讨论】:

    标签: azure message-queue azure-queues


    【解决方案1】:

    我想统计 Azure 队列中的消息数

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

    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);
            }
    

    队列计数结果:

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-16
        • 2021-05-25
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        • 2014-06-10
        • 1970-01-01
        • 2014-06-18
        相关资源
        最近更新 更多