Проверка количества сообщений в служебной шине возвращает значение true, хотя оно равно 0

У меня есть функция, которая проверяет, есть ли еще сообщение в моей сервисной шине, которое оно постоянно проверяет.

Функция, которая получает сумму:

    public int GetActiveMessageCount()
    {
        var connectionString = azureConnectionStringWithoutEntityPath;
        long messageCount = 0;
        try
        {
            var nameSpaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
            messageCount = nameSpaceManager.GetQueue(azureQueueName).MessageCountDetails.ActiveMessageCount;
        }
        catch
        {
            throw;
        }

        return (int)messageCount;
    }

И чек это:

    public bool MessageCountBiggerThenZero()
    {
        int messageCount = 0;
        try
        {
            messageCount = this.GetActiveMessageCount();
        }
        catch (Exception e)
        {
            Debug.WriteLine("An error occured while checking if the messageValue is bigger then zero and not null saying : " + e);
        }
        return messageCount > 0;
    }

это отлично работает в начале, когда имеется ноль сообщений, но после того, как он начинает получать сообщения и затем проходит последний обмен сообщениями, он все равно проходит проверку MessageCountBiggerThenZero.

Кто-нибудь знает, как это может быть? ServiceBus возвращает другие значения после последнего сообщения?

Редактировать:

Дополнительная информация о проверке (поэтому он по-прежнему передает оператор if, даже если сообщения больше нет):

public object RecieveOneMessageFromServiceBus()
    {
        var client = QueueClient.CreateFromConnectionString(azureConnectionString);
        BrokeredMessage brokermessage = null;
        client.PrefetchCount = 1; // get 1 message at a time
        if (MessageCountBiggerThenZero())
        {
            try
            {
                 // try to recieve message
            }
            catch
            {
                throw;
            }
        }
        else
        {
            return null;
        }       
    }

2 ответа

Решение

Хорошо, я, кажется, исправил это, но я понятия не имею, как и почему. Я реализовал это, как говорит Брюс, но это не сработало. Возможно, полный метод был отправлен не достаточно быстро, или что-то еще идет, но теперь я изменил свой метод получения для получения и удаления и добавил таймер для получения сообщения около 5 секунд, например:

 var client = QueueClient.CreateFromConnectionString(azureConnectionString,ReceiveMode.ReceiveAndDelete);

brokermessage = client.Receive(TimeSpan.FromSeconds(5));

С этим кодом, похоже, все работает, и любой, кто сможет объяснить мне, почему так нужен.

Редактировать:

См. Комментарий ниже для дополнительного объяснения о том, как реализовать это лучше

Согласно вашему коду, я предполагал, что вы не вызываете BrokeredMessage.Complete, который мог бы пометить сообщение как обработанное и удаленное после того, как вы обработали сообщение. Я изменил ваш код и добавил журналы для печати текущих активных сообщений следующим образом:

public static object RecieveOneMessageFromServiceBus()
{
    var client = QueueClient.CreateFromConnectionString(azureConnectionString);
    client.PrefetchCount = 1; // get 1 message at a time
    if (MessageCountBiggerThenZero())
    {
        try
        {
            Console.WriteLine("begin retrieving a message...");
            var message = client.Receive();
            Console.WriteLine($"received message with MessageId:{message.MessageId}");

            //after receive the message for handling
            Console.WriteLine($"after received a message in processing, active messages count:{GetActiveMessageCount()}");

            //after handled the message
            message.Complete();

            Console.WriteLine($"invoke message.Complete() to complete the received message");

            //after receive the message for handling
            Console.WriteLine($"after Complete() the message, active messages count:{GetActiveMessageCount()}");
        }
        catch
        {
            throw;
        }
    }
    return null;
}

введите описание изображения здесь

Кроме того, вы можете войти в портал Azure и проверить счетчик ACTIVE MESSAGE в разделе Обзор очереди служебной шины следующим образом:

введите описание изображения здесь

Кроме того, вы можете следовать официальному руководству о получении сообщений из очереди, не проверяя текущие активные сообщения самостоятельно, также вы можете обратиться к этой проблеме.

Другие вопросы по тегам