Как проверить, является ли публичное MSMQ пусто

StackOverflow https://stackoverflow.com/questions/3686312

  •  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 должен работать.

Ваше здоровье

Джон Брейвелл

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top