Как очистить исходящую очередь MSMQ

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

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

DIRECT=OS: COMPUTERprivate$queuename
OS: COMPUTERprivate$queuename
COMPUTERprivate$queuename

3 ответов


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

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

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


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

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 указывает на исходящую очередь.


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