Введение
В рамках одной из задач было необходимо интегрироваться с внешней системой. В проме и у всех разработчиков стоит IBM WebSphere поэтому WebSphere MQ отлично вписывался, учитывая также то, что с IBM WebSphere у них отличная интеграция «из коробки». Для начала установим и настроим WebSphere и WebSphere MQ, после напишем простое приложение для отправки и приема данных из очереди и завершим все установкой и настройкой HermesJMS и посмотрим как отправлять и просматривать сообщения из нее. Все будет производится в Windows 7. Перед тем как продолжать скачайте выше перечисленные программы.
Осторожно трафик!
Установка и настройка WebSphere и WebSphere MQ
Надеюсь Вы уже скачали все необходимые программы и готовы приступить к установке. Первым делом запустите установщик IBM Installation Manager. Дабы не увеличивать размер статьи скриншоты, которые не имеют особой смысловой нагрузки, буду убирать в спойлеры, т.к. полностью удалить из статьи считаю неправильно т.к. они дают понимание что Вы делаете все правильно.
Скриншоты 









Перезапускаем Instalation Manager и идем в пункт Файл -> Параметры. Добавляем хранилище из первого диска.

Нажимаем ОК и начинаем установку.
Скриншоты с описанием 



Убираем флажок с русского перевода.


Далее установщик попросит вставить диски 2 и 3. Вставляем их.






Убираем флажок с русского перевода.


Далее установщик попросит вставить диски 2 и 3. Вставляем их.


После установки автоматически запустится менеджер профилей.

Нажимаем кнопку «Create...» и далее делаем как на скриншотах ниже.
Скриншоты 









Теперь установим WebSphere MQ.
Скриншоты 

















После того как установка завершена давайте настроим WebSphere MQ и WebSphere. Начнем с WebSphere MQ так как нам понадобятся имена очередей и менеджер очередей при настройке WebSphere. Все команды исполняются из директории bin каталога WebSphere MQ. Первым делом создадим менеджер очередей и назовем его HABR_QUEUE_MANAGER, используя команду crtmqm.exe HABR_QUEUE_MANAGER.

Запустим наш только что созданный менеджер очередей с помощью команды strmqm.exe HABR_QUEUE_MANAGER.

Для того чтобы создать наши входящую и исходящую очереди запустим MQ-шную командную строку вызовом runmqsc.exe HABR_QUEUE_MANAGER и выполним подряд 2 команды:
- DEFINE QLOCAL(HOME.TO.ES) — очередь для отправки сообщений из нашего приложения во внешнюю систему
- DEFINE QLOCAL(ES.TO.HOME) — очередь для приема сообщений из внешней системы
Осталось создать слушатель и канал и запустить его и WebSphere MQ можно считать настроеной. Для этого выполните следующие команды:
- DEFINE LISTENER(HABR_QUEUE_MANAGER.LISTENER) TRPTYPE (TCP) PORT(1414)
- START LISTENER(HABR_QUEUE_MANAGER.LISTENER)
- DEFINE CHANNEL(SYSTEM.ADMIN.SVRCONN) CHLTYPE(SVRCONN)
Запомните порт 1414. Пригодится в настройке WebSphere Application Server.
Приступим к настройке WebSphere Application Server.
Создадим Connection factory. Для этого запустим консоль администратора и выберем пункт Resources->JMS providers->WebSphere MQ messaging provider->Queue connection factories->New (Как показано на скриншоте ниже).

Далее вводим имя и jndi имя.


Вписываем имя queue manager-а.


Если при проверке соединения возникает сообщение(которое показано на скриншоте ниже), то произведите следующие действия.
- Снова запустите командную строку MQ и выполните runmqsc.exe HABR_QUEUE_MANAGER
- Наберите ALTER QMGR CHLAUTH(DISABLED)
- Перейдите в раздел службы в Windows и у службы IBM MQSeries в разделе «Вход в систему» замените на свою учетную запись. Тоже самое проделайте для службы WebSphere Application Server 8.5
- Перезагрузите систему и запустите HABR_QUEUE_MANAGER и стартаните LISTENER(HABR_QUEUE_MANAGER.LISTENER)
- Теперь все должно заработать

Теперь создаем очереди. Нам нужно создать 2 очереди. Названия у них будут как и у очередей, созданных в WebSphere MQ. Если кто забыл то они называются ES.TO.HOME и HOME.TO.ES. Идем в пункт Resources->JMS->Queues->New


Вторую создаем по аналогии.

Осталось настроить Listener port. Заходим в Application servers -> server1 -> Message listener service -> Listener ports и добавляем новый.

Сохраняем конфигурацию. Мы указали jndi имя queue connection manager-а и jndi имя очереди, в которую будут приходить сообщения из внешней системы. Запустите порт.
Теперь у нас есть настроенные WebSphere Application Server и WebSphere MQ. Можно приступать к созданию простого тестового приложения.
Создание простого приложения для отправки и приема сообщений из очереди
Я умышленно при разработке приложения не буду использовать различные средства для сборки проектов таких как Maven, Gradle или ant, чтобы вы могли п��нять что вообще происходит за кулисами. Но все же для удобства напишу пару скриптов, с помощью которых будет производится сборка проекта в ear. Весь проект я выложил на github. Ниже я опишу только основные моменты.
Отправка сообщения в очередь
Чтобы отправить сообщение создадим сервлет, бин и форму для ввода сообщения.
Начнем с класса JMSMessageBean из модуля ejb-core. В методе ejbCreate мы получаем ссылки на Connection factory и очередь, в которую будем отправлять сообщения. Метод processMessage предназначен для создания текстового сообщения и отправки его в очередь.
public class JMSMessageBean implements SessionBean { private SessionContext sessionContext; private QueueConnectionFactory connectionFactory; private Queue destination; public boolean processMessage(String message) { QueueConnection jmsConnection = null; QueueSession jmsSession = null; try { jmsConnection = connectionFactory.createQueueConnection(); jmsSession = jmsConnection.createQueueSession(true, Session.AUTO_ACKNOWLEDGE); TextMessage jmsMessage = jmsSession.createTextMessage(); jmsMessage.setText(message); jmsSession.createSender(destination).send(jmsMessage); } catch (JMSException e) { return false; } finally { try { if (jmsSession != null) { jmsSession.close(); } if (jmsConnection != null) { jmsConnection.close(); } } catch (JMSException e) { e.printStackTrace(); } } return true; } public void ejbCreate() throws EJBException { try { Context ctx = new InitialContext(); connectionFactory = (QueueConnectionFactory) ctx.lookup("java:comp/env/QMHabr"); destination = (Queue) ctx.lookup("java:comp/env/jms/HOME.TO.ES"); } catch (NamingException e) { throw new EJBException(e); } } @Override public void ejbActivate() throws EJBException { } @Override public void ejbPassivate() throws EJBException { } @Override public void ejbRemove() throws EJBException { } @Override public void setSessionContext(SessionContext sessionContext) throws EJBException { this.sessionContext = sessionContext; } }
Ниже показан наш сервлет SendJMSMessageServlet. В методе init получаем ссылку на бин, который описан выше. Далее в методе doPost он принимает сообщение от формы и направляет методу processMessage бина. Всю остальную работу выполняет бин.
public class SendJMSMessageServlet extends HttpServlet { private static final String MESSAGE_PARAMETER_NAME = "message"; private static final String MESSAGE_SENDING_SUCCESS = "Сообщение успешно отправлено"; private static final String MESSAGE_SENDING_ERROR = "Сообщение отправлено с ошибкой"; private JMSMessage jmsMessage = null; @Override public void init() throws ServletException { super.init(); try { Context ctx = new InitialContext(); Object objHome = ctx.lookup("java:comp/env/ejb/JMSMessageLocal"); JMSMessageHome jmsMessageHome = (JMSMessageHome) PortableRemoteObject.narrow(objHome, JMSMessageHome.class); jmsMessage = jmsMessageHome.create(); } catch (Exception e) { throw new ServletException(e); } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("/sendMessage.jsp").forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String message = request.getParameter(MESSAGE_PARAMETER_NAME); request.setAttribute(MESSAGE_PARAMETER_NAME, (jmsMessage.processMessage(message)) ? MESSAGE_SENDING_SUCCESS : MESSAGE_SENDING_ERROR); request.getRequestDispatcher("/viewMessage.jsp").forward(request, response); } }
Html форма отправки самая элементарная. Это не самая важная часть. Сообщение можно было захардкодить или получать из properties файла. Но код все равно приведу.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <html> <head> <meta http-equip="Content-Type" content="text/html; charset=UTF-8"/> <title>Отправка сообщения в очередь</title> </head> <body> <form action="sendMessage" method="POST"> <table> <tr> <td>Введите сообщение:</td> <td><input type="text" name="message" size="70"/></td> </tr> <tr> <td colspan="2"><input type="submit" name="submitMessage" value="Отправить"/></td> </tr> </table> </form> </body> </html>
Установка и настройка HermesJMS
Если WebSphere MQ установлена на другой машине и Вам надоело бегать проверять сообщения в очереди или просто хотите иметь удобное средство для отправки тестовых сообщений в очередь, то можно использовать HermesJMS. Возможно есть аналоги, но те, которые я находил, были платные. Посоветуйте в комментариях хорошие бесплатные аналоги если знаете. С удовольствием рассмотрю другие подобные системы. Конкретно в HermesJMS не совсем устраивают некоторые UI баги и не освобождаются ресурсы если отправлять сообщение из файла (лочит намертво), но жить с ними можно.
И так, приступим к установке и настройке.
Скриншоты 











Запустите HermesJMS и добавьте новую сессию. Для начала перейдите во вкладку Providers и добавьте новую группу. Назовите ее как на скриншоте(хотя это не важно) и добавьте все jar файлы, перечисленные ниже.

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

Теперь попробуем отправить сообщение в нашу очередь. Для это заходим по адресу http://localhost:9080/habr/sendMessage и вводим любое сообщение в поле ввода и нажимаем кнопку «Отправить».

Теперь откройте HermesJMS и откройте очередь HOME.TO.ES на просмотр. Если Вы увидели сообщение как показано ниже на скриншоте, то все произведенные выше действия Вы выполнили верно.

На этом я статью завершаю. Всем спасибо за внимание! Надеюсь она будет кому-то полезна.
