Невозможно получить длину очереди / количество сообщений из Azure.

У меня есть вариант использования, когда мне нужно поставить в очередь определенное количество сообщений, когда текущая длина очереди падает ниже указанного значения. Поскольку я работаю в 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 (например, http://myaccount.queue.core.windows.net/myqueue)

Может ли кто-нибудь помочь пролить свет на то, что я делаю неправильно.


ИЗМЕНИТЬ

Я подтвердил, что с помощью MessageFactory я могу создавать QueueClient, а затем успешно ставить / выводить из очереди сообщения. Когда я использую CloudStorageAccount, очередь никогда не присутствует, поэтому процедуры подсчета и GetMessage никогда не работают. Полагаю, это не одно и то же ??? Предполагая, что я прав, мне нужно измерить длину очереди служебной шины. Это возможно?


person JoeGeeky    schedule 20.06.2012    source источник
comment
И ... есть ли очередь? :-) Что произойдет, если вы позвоните queue.AddMessage(...) или queue.GetMessage(...)?   -  person user94559    schedule 21.06.2012
comment
@smarx Я могу без проблем ставить и выводить из очереди. На мой взгляд, это означает, что он действительно существует. Не говоря уже о том, что я создал его на портале, значит, он должен существовать. (Пугай!)   -  person JoeGeeky    schedule 21.06.2012
comment
@smarx Я должен был упомянуть, что постановка в очередь и постановка из очереди выполняются в отдельных процессах, поэтому они должны существовать.   -  person JoeGeeky    schedule 21.06.2012
comment
Вы не можете создать очередь на портале. Я придерживаюсь Очереди не существует. Попробуйте поставить queue.GetMessage() прямо перед queue.RetrieveApproximateMessageCount(). Бьюсь об заклад, это не сработает с той же ошибкой.   -  person user94559    schedule 21.06.2012
comment
..или попробуйте добавить CreateIfNotExists. Возможно, вы подключаетесь к другой учетной записи хранения в другом процессе?   -  person Richard Astbury    schedule 21.06.2012
comment
Попробуйте запустить скрипач и проверить имена очередей, используемые как операциями постановки / удаления из очереди, так и попыткой получить счетчик очереди. Вы также можете попробовать использовать стороннюю утилиту хранения, чтобы проверить за пределами вашего кода, что очередь действительно существует и имеет содержимое. Некоторые из этих инструментов будут поддерживать отображение глубины очереди и, таким образом, могут использоваться для проверки того, что операция работает. Если инструменты отображают вещи правильно, значит, в вашем коде что-то не так, либо адресуемость, либо что-то не существует, когда вы этого тоже ожидаете.   -  person BrentDaCodeMonkey    schedule 21.06.2012
comment
Когда я перехожу к Services --> Service Bus --> Queues на портале, я вижу, что очередь существует и в ней есть сообщения. Когда я использую MessagingFactory, я могу без проблем создавать QueueClient и Enqueue / Dequeue, но не вижу длины. Когда я использую CloudStorageAccount и создаю экземпляр CloudQueue, очереди не существует. Полагаю, это не те очереди? Как узнать длину очереди служебной шины? Я только что перепутал отдельные технологии?   -  person JoeGeeky    schedule 21.06.2012
comment
Вы используете две разные технологии организации очередей. Похоже, вы создали очередь служебной шины, но код, который вы даете, предназначен для очереди хранилища Azure. Это не одно и то же, несмотря на схожие цели.   -  person Brian Reischl    schedule 21.06.2012
comment
@breischl Я наконец понял это. Знаете ли вы, есть ли способ узнать длину очереди служебной шины? Опять же, возможно, мне следует отозвать это и задать другой вопрос.   -  person JoeGeeky    schedule 21.06.2012


Ответы (2)


RetrieveApproximateMessageCount() устарел

если вы хотите использовать ApproximateMessageCount для получения результата, попробуйте это

CloudQueue q = queueClient.GetQueueReference(QUEUE_NAME);
q.FetchAttributes();
qCnt = q.ApproximateMessageCount;
person Naga Sailesh    schedule 25.04.2014
comment
Такой простой ответ на простую проблему. Хороший. - person Trevor Sullivan; 31.03.2016
comment
Было бы так хорошо, если бы ApproximateMessageCount выдал приятное описательное исключение, говорящее, что вам нужно сначала получить атрибуты. - person riezebosch; 28.05.2019
comment
CloudQueue теперь также устарел (только в устаревшем SDK), поэтому он уже устарел - person Liam; 27.10.2020

Метод CloudQueue устарел (вместе с SDK v11).

Следующий фрагмент представляет собой текущую замену (из Документы Azure)

//-----------------------------------------------------
// 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 < / а>

person nullforce    schedule 03.12.2020