Могу ли я открыть кластерную очередь MQ для записи в Perl? - PullRequest
3 голосов
/ 28 мая 2010

Если у меня определена очередь Websphere MQ в другом администраторе очередей в кластере, есть ли способ открыть ее для записи с использованием интерфейса Perl? Код ниже возвращает mqrc 2085.

$messageQ = MQSeries::Queue->new
        (
         QueueManager         => $qMgr,
         Queue                => $queue,
         Options              => $openOpt
         ) or die ">>>ERROR2: Unable to open the queue: $queue\n";
}

1 Ответ

3 голосов
/ 28 мая 2010

Да! Модули Perl являются тонким слоем над API-интерфейсом WMQ и раскрывают все основные опции, а также большинство действительно эзотерических вещей.

Когда вы открываете очередь, WebSphere MQ выполняет разрешение имен для значений, которые вы указываете для имен очередей и QMgr. Если вы предоставите имя очереди и имя QMgr, то ссылка на объект будет полностью определена, и WMQ попытается открыть ее как имя. Таким образом, если указанное вами имя является локальным QMgr, а кластеризованная очередь не имеет локально определенного экземпляра, то при открытии произойдет сбой с 2085 неизвестным именем объекта.

Хитрость при открытии кластеризованной очереди заключается в предоставлении нулевого значения для имени QMgr. Это приводит к тому, что при разрешении имен локальный QMgr проверяет наличие очереди с тем же именем, а затем не находит ни одного, проверяет хранилище кластера и разрешает открытие в кластеризованную очередь. Обратите внимание, что очередь должна быть объявлена ​​в кластере, чтобы это работало. В частности, атрибут CLUSTER или CLUSNL целевой очереди должен быть непустым и относиться к кластеру, в котором участвует исходный QMgr. Аналогично, целевой QMgr также должен участвовать в том же кластере, что и исходный QMgr.

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

Наконец, вы можете определить локальный псевдоним для кластеризованной очереди. Например, если вы находитесь на QMGRA и DEF QA (TARGET.QUEUE) TARGQ (TARGET.QUEUE), а затем на QMGRB и QMGRC в том же кластере, который вы DEF QL (TARGET.QUEUE) CLUSTER (MYCLUS), то можно открыть QMGR = QMGRA QUEUE = TARGET.QUEUE и по-прежнему работает должным образом. Обратите внимание, что псевдоним НЕ объявляется в кластере, но целевая очередь. Единственная проблема с этим подходом заключается в том, что при первом открытии вызов API может завершиться ошибкой, если запрос кластера занимает слишком много времени. Когда я делаю это в Production, я всегда заранее использую amqsput для псевдонима, чтобы QMgr запрашивал репозиторий до того, как само приложение откроет очередь. Зачем ты это делаешь? Если вас беспокоит безопасность, вы, вероятно, не захотите авторизовать все приложения непосредственно в кластере XMitQ, потому что, как отмечалось выше, они могут затем поместить сообщение в любую очередь любого QMgr в кластере, включая SYSTEM. .ADMIN.COMMAND.QUEUE. Псевдоним дает вам возможность повесить авторизации и ограничить пользователя определенными адресатами в кластере.

Итак, короткий ответ, убедитесь, что вы указали нулевое имя QMgr при вызове Open или настроили локальный псевдоним в кластеризованной очереди. Подробнее об аспектах безопасности см. Презентацию WMQ Security по адресу http://t -rob.net / links

...