无法从Azure获取队列长度/消息计数

时间:2012-06-20 23:49:03

标签: c# azure azure-storage azure-queues

我有一个用例,当前队列长度低于指定值时,我需要对选定数量的消息进行排队。由于我在Azure中运行,我正在尝试使用RetrieveApproximateMessageCount()方法来获取当前的消息计数。每当我打电话给我时,我都会得到一个说明StorageClientException: The specified queue does not exist.的例外情况。以下是对我所做的事情的回顾:

  1. 在门户网站中创建了队列,并成功将消息排入其中。

  2. 在门户网站中创建了存储帐户,它处于创建/在线状态

  3. 按如下方式对查询进行编码(使用http和https选项):

    var storageAccount = new CloudStorageAccount(
            new StorageCredentialsAccountAndKey(_messagingConfiguration.StorageName.ToLower(),
            _messagingConfiguration.StorageKey), false);
    
    var queueClient = storageAccount.CreateCloudQueueClient();
    var queue = queueClient.GetQueueReference(queueName.ToLower());
    int messageCount;
    
    try
    {
        messageCount = queue.RetrieveApproximateMessageCount();
    }
    catch (Exception)
    {
        //Booom!!!!! in every case
    }
    
    // ApproximateMessageCount is always null
    
    messageCount = queue.ApproximateMessageCount == null ? 0 : queue.ApproximateMessageCount.Value;
    
  4. 我已经确认名称是正确的,没有特殊的字符,数字或空格,结果显示queue Url,好像它是根据API文档正确形成的(例如{ {3}}

  5. 任何人都可以帮助我了解我做错了什么。


    修改

    我已经确认使用MessageFactory我可以创建QueueClient,然后成功排队/取消队列消息。当我使用CloudStorageAccount时,队列永远不存在,因此计数和GetMessage例程永远不会起作用。我猜这些不是一回事???假设,我是对的,我需要的是测量服务总线队列的长度。这可能吗?

2 个答案:

答案 0 :(得分:45)

不推荐使用RetrieveApproximateMessageCount()

如果你想使用ApproximateMessageCount来获得结果,试试这个

CloudQueue q = queueClient.GetQueueReference(QUEUE_NAME);
q.FetchAttributes();
qCnt = q.ApproximateMessageCount;

答案 1 :(得分:0)

不推荐使用CloudQueue方法(与v11 SDK一起使用)。

以下代码段是当前替换代码(来自Azure Docs

//-----------------------------------------------------
// Get the approximate number of messages in the queue
//-----------------------------------------------------
public void GetQueueLength(string queueName)
{
    // Get the connection string from app settings
    string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];

    // Instantiate a QueueClient which will be used to manipulate the queue
    QueueClient queueClient = new QueueClient(connectionString, queueName);

    if (queueClient.Exists())
    {
        QueueProperties properties = queueClient.GetProperties();

        // Retrieve the cached approximate message count.
        int cachedMessagesCount = properties.ApproximateMessagesCount;

        // Display number of messages.
        Console.WriteLine($"Number of messages in queue: {cachedMessagesCount}");
    }
}

https://docs.microsoft.com/en-us/azure/storage/queues/storage-dotnet-how-to-use-queues?tabs=dotnet#get-the-queue-length