Учитывая адрес net.msmq, как я могу проверить, существует ли эта очередь? - PullRequest
0 голосов
/ 20 сентября 2011

У меня есть сервис, который вставляет вещи в MSMQ через WCF.Однако это может занять много времени, прежде чем какие-либо сообщения будут вставлены в очередь, и именно тогда произойдет ошибка для несуществующей очереди.

Моя идея состоит в том, чтобы пройтись по конфигурации WCF и проверить,очередь существует при запуске.Конечные точки WCM MSMQ имеют адрес в формате net.msmq://machine/private/queue.

Учитывая MSMQ-адрес WCF в формате net.msmq, как я могу проверить, существует ли эта очередь без постановки в очередь фактического сообщения?

Редактировать

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

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Проверить наличие очереди можно методом MessageQueue.Exists . Обратите внимание, что вы должны использовать стандартный формат адресации MSMQ,

FORMATNAME:DIRECT=OS:(server name)\PRIVATE$\(queue name) 

Тем не менее, проверка наличия очереди сообщений перед инициализацией отправителя своего рода сводит на нет цель использования очереди сообщений в первую очередь.

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

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

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

ОБНОВЛЕНИЕ Как отмечает Джон Брэкуэлл в своем комментарии: Не так. Сообщение MSMQ будет доставлено удаленному администратору очередей и, если очередь не существует, будет отброшено. При ведении журнала с отрицательным исходным кодом копия отклоненного сообщения будет помещена в соответствующую очередь недоставленных сообщений отправителя

Надеюсь, это поможет.

UPDATE

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

0 голосов
/ 20 сентября 2011

Вы можете использовать счетчики производительности WMI для MSMQ, чтобы проверить, существует ли интересующая вас очередь.Код VBScript в этом посте показывает объекты WMI MSMQ, с которыми вам нужно работать.Это сообщение в блоге показывает, что делать, если они отсутствуют на целевой машине.Вам потребуется собрать компонент .NET на основе кода VBScript в ссылке для использования вашей службой.

...