14

我有一个用例,当当前队列长度低于指定值时,我需要将选定数量的消息排队。由于我在 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. 我已经确认名称的大小写正确,没有特殊字符、数字或空格,并且生成的queueUrl 看起来好像它是根据 API 文档正确形成的(例如http://myaccount.queue.core.windows.net/myqueue )

任何人都可以帮助阐明我做错了什么。


编辑

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

4

2 回答 2

64

RetrieveApproximateMessageCount()已弃用

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

CloudQueue q = queueClient.GetQueueReference(QUEUE_NAME);
q.FetchAttributes();
qCnt = q.ApproximateMessageCount;
于 2014-04-25T07:37:49.180 回答
6

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

于 2020-12-03T06:32:26.233 回答