Deploying WebSphere MQ bridge for HTTP on WebSphere Liberty Profile

Когда необходимо быстро интегрировать с WebSphere MQ смежную систему, а у разработчиков нет времени или желания, или есть другие причины не разбираться с клиентом WMQ и писать клиентское приложение, на помощь приходит мост WMQ – HTTP.

На момент написания статьи единственным официальным мостом WMQ – HTTP является приложение WMQHTTP.war, поставляемое вместе с продуктом IBM WebSphere MQ. Найти его можно в диретории /opt/mqm/java/http (Linux). Мост позволяет работать с очередями и топиками MQ используя http-запросы POST, GET и DELETE.

Преимущества использования моста:

  • Позволяет связать с MQ любую среду поддерживающую HTTP
  • Не требуется установка клиента WebSphere MQ MQI
  • Не нужно писать свой собственный мост для работы с MQ
  • WMQHTTP позволяет получить доступ к очередям и топикам используя REST

Приложение WMQHTTP.war устанавливается на практически любой сервер приложений, но официально поддерживается только WebSphere Application Server. Получается следующая схема работы моста:

WMQHTTP bridgeДля тех, кто не хочет использовать для этих целей полноценный и тяжелый сервер приложений WAS, я предлагаю рассмотреть как развернуть приложение WMQHTTP.war на WebSphere Liberty Profile (WLP).

Для подключения WLP к MQ нам потребуется ресур адаптер wmq.jmsra.rar, который можно взять из поставки MQ. Он находится в директории /opt/mqm/java/lib/jca (Linux). Скопируем его в удобное расположение, например, wlp_install_root/usr/shared/resources/wmq.

Здесь мы не будем рассматривать как устанавливать и создавать сервер приложений WebSphere Liberty. Перейдем к основному, к настройке сервера, конфигурированию server.xml.

Если попробовать развернуть приложение WMQHTTP.war обычным способом, то есть поместить его в директорию “apps”, прописать ресурс адаптер в server.xml, дать ссылки на jndi ресурсы и добавить фичу wmqJmsClient-1.1, то получим ошибку:

Т.е. приложение пытается использовать класс com.ibm.mq.jms.MQDestination напрямую, в обход ресурс адаптера.

Запустить ресур адаптер можно не через готовую фичу либерти wmqJmsClient-1.1, а как общий адаптер, состоящий из функций jca-1.6 + jms-1.1, чтобы приложение могло получить доступ к классам адаптера. При этом важно не использваоть тот же идентификатор для адаптера (wmqJms), который использует фича либерти по умолчанию.

Итоговый рабочий server.xml:

Теперь приложение запустится корректно и можно приступать к работе. Для этого используются следующие HTTP-методы:

  • POST – для отправки сообщения в очередь или топик (mqput)
  • DELETE – для получения сообщения из очереди или топика (mqget)
  • GET – для просмотра первого сообщения в очереди (mqbrowse). Не удаляет сообщение из очереди. Не применимо для топологии publish/subscribe.

Для работы с очередью URL будет выглядеть следующим образом:

http://wlp-host:port/WMQHTTP/msg/queue/queue_name/

А для работы с топиком так:

http://wlp-host:port/WMQHTTP/msg/topic/topic_string/

С помощью HTTP-заголовков в WMQHTTP можно работать с параметрами сообщения. Например, задавать его время жизни (x-msg-expiry), формат (x-msg-format) и приоритет (x-msg-priority). Подробнее с этим можно можно ознакомиться в документе (стр. 14):

Icon of WebSphere MQ Bridge for HTTP Version 1.1 WebSphere MQ Bridge for HTTP Version 1.1 (362.9 KB)

Для полноценного использования моста необходимо решить вопрос с разграничением доступа к объектам менеджера через приложение WMQHTTP. Рассмотрим как это сделать.

Со стороны WMQ это достигается использованием записей аутентификации канала (Channel Authentication Records). В этом случае каналу и IP-адресу сервера(-ов) WLP назначается пользователь, из под которого WLP будет работать с MQ, а на объектах MQ (очередях и топиках) устанавливаются необходимые права доступа (put, get, display, inquire и т.п.) для этого пользователя.

Тогда получается, что любой клиент, пользующийся мостом, может получить доступ к любой очереди или топику MQ, с которыми работает WLP. Решить этот вопрос можно с помощью базовой аутентификации HTTP-сервера (Basic Authentication). Далее рассмотрим процесс настройки этого способа.

Перед сервером WLP необходимо установить HTTP-сервер, например Apache или IBM HTTP Server, на котором мы будем делать необходимые настройки. Первый этап настройки базовой аутентификации – это создание файла htpasswd с пользователями и паролями.

Для этого воспользуемся утилитой htpasswd, которая в ходит в поставку сервера Apache/IHS. Она находится в директории apache_install_root/bin. Выполним следующую команду:

htpasswd -c apache_install_root/conf/wlp.htpasswd wmqhttpuser1

Эта команда попросит ввести пароль для пользователя wmqhttpuser1 и создаст новый файл wlp.htpasswd в директории apache_install_root/conf. В этом файле будет записана пара пользователь:хеш пароля пользователя. Ключ -c означает создание нового файла, если файл уже был создан, то он будет перезаписан. Если необходимо добавить еще одного пользователя, то команду следует выполнять без ключа -c.

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

  • -d – хеш пароля вычисляется с использованием стандартной Unix-функции CRYPT. Используется по умолчанию;
  • -m – хеш пароля вычисляется по алгоритму MD5;
  • -s – хеш пароля вычисляется по алгоритму SHA1.

Для удаления указанного пользователя и его пароля из файла используется команда htpasswd с ключом -D.

Перейдем к следующему этапу настройки базовой аутентификации. Добавляем защищаемый ресурс в конфигурацию HTTP-сервера (в файл httpd.conf или в файл .htaccess).

Например, у нас есть очередь TESTQ1 и пользователь wmqhttpuser1. Необходимо дать доступ к очереди TESTQ1 только пользователю wmqhttpuser1. Для этого в файле httpd.conf добавим следующие:

Теперь при попытке обратиться к очереди TESTQ1 без указания логина и пароля будет возникать ошибка:

Таким образом можно организовать доступ различных систем и пользователей к объектам менеджера очередей через мост.

В завершении статьи выкладываю для загрузки приложение WMQHTTP.war и ресур адаптер WMQ 7.5:

Icon of Zip Archives WMQHTTP.war (154.5 KB)
Icon of Zip Archives wmq.jmsra.rar (8.0 MB)

VN:F [1.9.22_1171]
Rating: 5.0/5 (2 votes cast)
Метки: , , ,
Опубликовано в WebSphere Application Server, WebSphere MQ, Утилиты
3 комментария на “Deploying WebSphere MQ bridge for HTTP on WebSphere Liberty Profile
  1. Сергей:

    Не совсем понял зачем использовать лишнюю сущность.
    На брокере пишем поток с входной http или soap нодой и… всё.

    Чего я не понимаю?

    Если без брокера то можно настроить сохранение http-запроса в файл, из файла класть в mq-очередь утилитой наподобие mqputs, запускать из sh или bat скрипта.
    Хотя это уже велосипед, да.

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  2. Sergey Kirsanov Sergey Kirsanov:

    Идея в том, что бы интегрировать с MQ приложения не используя при этом IIB и клиент MQ (SOAP over JMS), только настройкой окружения без привлечения разработчиков.
    Согласен, что на IIB это делается легче, но не всегда существует возможность его использования, например, когда IIB не закуплен или количество лицензий сильно ограничено.
    P.S.: Начиная с MQ v8 мост “IBM MQ bridge for HTTP” официально признан устаревшим, но в поставку MQ он по-прежнему включен.

    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)
  3. Sergey Kirsanov Sergey Kirsanov:

    Пример использования:

    curl -X POST \
    -H “Content-Type: text; charset=utf-8″ \
    -H “x-msg-format: MQSTR” \
    -H “x-msg-persistence: PERSISTENT” \
    -u user:password \
    -d ‘test message body’ \
    http://wlp-host:port/WMQHTTP/msg/queue/TESTQ/

    Отправка сообщения в очередь TESTQ с параметрами: persistent, формат MQSTR, кодовая страница 1208,
    -u user:password – логин/пароль HTTP BasicAuth
    -d ‘test message body’ – тело сообщения

    VN:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Выбор языка: