Проверка количества сообщений в служебной шине возвращает значение 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 в разделе Обзор очереди служебной шины следующим образом:
Кроме того, вы можете следовать официальному руководству о получении сообщений из очереди, не проверяя текущие активные сообщения самостоятельно, также вы можете обратиться к этой проблеме.