Введение
В рамках одной из задач было необходимо интегрироваться с внешней системой. В проме и у всех разработчиков стоит 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 на просмотр. Если Вы увидели сообщение как показано ниже на скриншоте, то все произведенные выше действия Вы выполнили верно.

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