Как очистить исходящую очередь MSMQ - PullRequest
6 голосов
/ 26 января 2011

Есть ли способ очистить исходящую очередь. Похоже, я не могу сделать это с помощью оснастки MMC, и когда я пытаюсь удалить его в коде, я получаю сообщение об ошибке Format name is invalid компьютер, на который отправляются сообщения, не существует, поэтому они никогда не будут отправлены однако очереди заполнили максимальный объем памяти для MSMQ, поэтому каждый раз, когда мое приложение пытается отправить другое сообщение, я получаю исключение insufficient resources.

Я пробовал следующие форматы, и все они терпят неудачу за исключением format name is invalid

DIRECT = OS: COMPUTER \ private $ \ queuename
ОС: COMPUTER \ private $ \ queuename
КОМПЬЮТЕР \ частного $ \ ИмяОчереди

Ответы [ 3 ]

6 голосов
/ 26 января 2011

Вы сможете удалить его вручную из оснастки MMC. MSMQ становится очень скупым, когда достигает пределов хранилища, поэтому многие операции завершатся неудачно с «отказом в доступе» и тому подобными вещами.

Долгосрочное решение, очевидно, состоит в том, чтобы изменить конфигурацию, чтобы было достаточно места для хранения ваших конкретных моделей использования.

Изменить: Возможно, вы столкнулись с ограничением в управляемом API, связанным с возможностями администратора и удаленными очередями. Взгляните на эту статью Инго Раммера. Он даже включает пример p-invoke.

3 голосов
/ 27 сентября 2012

возможно использовать управляемый код для очистки исходящей очереди:

using (var msgQueue = new MessageQueue(GetPrivateMqPath(queueName, remoteIP), QueueAccessMode.ReceiveAndAdmin))
{
    msgQueue.Purge();
}

, в котором GetPrivateMqPath:

if (!string.IsNullOrEmpty(remoteIP))
    return String.Format("FORMATNAME:DIRECT=TCP:{0}\\private$\\{1}", remoteIP, queueName);
else
    return @".\private$\" + queueName;

QueueAccessMode.ReceiveAndAdmin указывает на исходящую очередь.

1 голос
/ 26 января 2011

Вы можете попробовать FORMATNAME:DIRECT=OS:computer\PRIVATE$\queuename.

...