Вопрос

Я создал скрипт для мониторинга набора очередей, и, пока он отлично работает с удаленными частными очередями, он не работает с исходящими очередями. Я сделал эксперимент, удалив все, кроме необходимого из скрипта, и я создал следующий тестовый скрипт:

var info = new ActiveXObject("MSMQ.MSMQQueueInfo");
info.FormatName = /*<Queue name>*/;

// 0x80 = MQ_ADMIN_ACCESS
// 0x20 = MQ_PEEK_ACCESS
// 0x00 = MQ_DENY NONE
var mq = info.Open(0x80 | 0x20, 0x00);

var msg = mq.PeekCurrent(false, true, 0); 
if (msg != null) {
    WScript.echo("message found");  
}
else
{
    WScript.echo("Nothing");
}
mq.close();

Затем я запустил его на сервере и даже если очередь содержит более тысячи сообщений, Peekcurrent. всегда возвращается null. Если я удалю MQ_Admin_Access, он пытается подключиться к удаленной личной очереди, и он раз разумеется (как и ожидалось, как оно допустить, чтобы сообщения кукол). Если я тогда запустите удаленную личную очередь, он правильно считывает сообщение из него.

Из любопытства, я узнал, что info.open Всегда преуспевает независимо от имени очереди (то есть существует ли он или нет), когда используется MQ_Admin_Acccess. Например, я набрал «Direct = OS: что угодно частное $ RandyQueEuename», и я не получил никакой ошибки.

Я не эксперт MSMQ (совсем наоборот), поэтому я, вероятно, делаю очевидную ошибку, и я не вижу этого. Любая помощь более чем приветствуется. Спасибо.

Вопрос на сторону: Можно ли заглянуть удаленную исходящую очередь? На данный момент скрипт работает на машине, где расположена исходящая очередь, я расположен, но это не единственный с этими очередями. Я хотел бы избежать развертывания сценария везде, я бы предпочел иметь его в одном месте. Спасибо.

Это было полезно?

Решение

Я нашел ответы на свои вопросы:

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

    1. Создать новое общее приложение
    2. Ресурс внутри группы, где работает сервис MSMQ, и укажите его в свой скрипт.
    3. В конфигурации нового ресурса добавьте службу MSMQ как зависимость.
    4. Убедитесь, что флажок «использовать имя сети как имя компьютера» проверено.

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

  • Исходящие очереди не являются реальными очередями, но можно рассматривать как «Список сообщений, сгруппированных в очередь, которыми они предназначены». Поэтому они не могут контролироваться удаленно. Это означает, что для того, чтобы контролировать их, скрипт / приложение, которое он должен быть развернут на каждой машине, и, в кластеризованной среде, экземпляр должен работать в каждой группе кластеров. Это добавляет значительный накладной расход, если есть много серверов, но его можно преодолеть, создавая централизованную систему. Большая задача в любом случае ...

Я надеюсь, что мои выводы будут полезны кому-то в будущем. :) Вернуться к выпечки пиццы ...

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