Как проверить, если публичный MSMQ пуст - PullRequest
4 голосов
/ 10 сентября 2010

Есть ли способ проверить, является ли общедоступный 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: длина не может быть меньше нуля.

Ответы [ 3 ]

7 голосов
/ 29 декабря 2011

Я только начал работать с очередями сообщений, но у моего коллеги есть хороший способ проверить, пуста ли очередь:

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
        }
    }
}

Преимущество использования этого метода состоит в том, что он не выдает исключение,и я не думаю, что вам нужно ждать, пока истечет время ожидания.

5 голосов
/ 10 сентября 2010

Метод Peek доступен только на удаленных машинах, когда вы используете имя прямого формата для доступа к очереди.Вы должны иметь возможность использовать один и тот же код, если только вы не полагаетесь на службы каталогов, чтобы доставить вас в очередь.

Прямые имена очереди обычно выглядят примерно так: DIRECT=URLAddressSpecification/QueueName

0 голосов
/ 10 сентября 2010

Лео, ты уверен в этом?Вы не можете использовать имя пути с удаленным Peek?В возвращенной ошибке не указано неверное имя формата, что было бы ожидаемо, если бы это было так.Фактически ошибка, по-видимому, находится в строке «isQueueEmpty = false» - try / catch не делает различий между строками peek и isQueueEmpty.Могу поспорить, что вызов isQueueEmpty получает исключение, которое переводится в отрицательное число.Однако теперь ваше решение может быть правильным - для многих удаленных вызовов в MSMQ требуются имена форматов, а не пути.Поэтому, если вы используете имя формата для создания myQueue, isQueueEmpty должен работать.

Cheers

John Breakwell

...