Как проверить, является ли публичное MSMQ пусто
-
02-10-2019 - |
Вопрос
Есть ли способ проверить, пусто пустой MSMQ? Для частного MSMQ легко:
private bool IsQueueEmpty(string path)
{
bool isQueueEmpty = false;
var myQueue = new MessageQueue(path);
try
{
myQueue.Peek(new TimeSpan(0));
isQueueEmpty = false;
}
catch (MessageQueueException e)
{
if (e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
{
isQueueEmpty = true;
}
}
return isQueueEmpty;
}
Как бы я сделал тот же чек для публичного MSMQ? Если я попытаюсь проверить публичное msmq с кодом выше, это дает мне ошибку на пике:
System.argumentOutofrangeexception: длина не может быть меньше нуля.
Решение
То Peek
Метод доступен только на удаленных машинах, когда вы используете имя прямого формата для доступа к очереди. Вы должны быть в состоянии использовать тот же код, до тех пор, пока вы не полагаетесь на службы каталогов, чтобы получить вас в очередь.
Прямые имена очереди обычно выглядят что-то вроде: DIRECT=URLAddressSpecification/QueueName
Другие советы
Я только что начал работать с очередями сообщений, но у меня есть этот хороший способ проверки, если очередь пуста:
if (MessageQueue.Exists(fullQueuePath))
{
// FYI, GetMessageQueue() is a helper method we use to consolidate the code
using (var messageQueue = GetMessageQueue(fullQueuePath))
{
var queueEnum = messageQueue.GetMessageEnumerator2();
if (queueEnum.MoveNext())
{
// Queue not empty
}
else
{
// Queue empty
}
}
}
Преимущество использования этого метода заключается в том, что он не бросает исключение, и я не думаю, что это требует, чтобы вы дождались ожидания времени ожидания.
Лев, ты уверен в этом? Вы не можете использовать название пути с REMOTE PEEK? Возвращенная ошибка не говорит о недействительном имени формата, которое было бы ожидать, если это было так. На самом деле, ошибка, по-видимому, находится на линии «iSqueuePty = False» - попробуйте / CATP не различает различие между PEEK и линией IsqueueUpty. Могу поспорить, что вызов iSqueuePty получает исключение, которое переводится на отрицательное число. Теперь ваше решение, однако, может быть правильным - множество удаленных звонков в MSMQ требует имен формата вместо имен путей. Поэтому, если вы используете имя формата для создания Mycie, ISQUEUEEMEPTY должен работать.
Ваше здоровье
Джон Брейвелл