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

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

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

DIRECT = OS: COMPUTER \ private $ \ queuename
OS: COMPUTER \ private $ \ queuename
КОМПЬЮТЕР \ частное $ \ queuename


person Brian    schedule 26.01.2011    source источник
comment
Это очередь, в которой отправленные сообщения сохраняются перед отправкой на другой компьютер.   -  person Brian    schedule 26.01.2011


Ответы (3)


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

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

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

person kprobst    schedule 26.01.2011
comment
Хорошая статья, хотя и не попробовал. Потому что одно из изображений на экране показало мне, что я делал не так, лол. Я щелкнул правой кнопкой мыши имя очереди и исключил возможность очистки, чтобы появиться там. Пришлось пойти глубже и щелкнуть правой кнопкой мыши сообщения очереди - person Brian; 26.01.2011

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

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

person Daniel B    schedule 26.09.2012

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

person Filburt    schedule 26.01.2011