Введение
В рамках одной из задач было необходимо интегрироваться с внешней системой. В проме и у всех разработчиков стоит IBM WebSphere поэтому WebSphere MQ отлично вписывался, учитывая также то, что с IBM WebSphere у них отличная интеграция «из коробки». Для начала установим и настроим WebSphere и WebSphere MQ, после напишем простое приложение для отправки и приема данных из очереди и завершим все установкой и настройкой HermesJMS и посмотрим как отправлять и просматривать сообщения из нее. Все будет производится в Windows 7. Перед тем как продолжать скачайте выше перечисленные программы.
Осторожно трафик!
Установка и настройка WebSphere и WebSphere MQ
Надеюсь Вы уже скачали все необходимые программы и готовы приступить к установке. Первым делом запустите установщик IBM Installation Manager. Дабы не увеличивать размер статьи скриншоты, которые не имеют особой смысловой нагрузки, буду убирать в спойлеры, т.к. полностью удалить из статьи считаю неправильно т.к. они дают понимание что Вы делаете все правильно.
Перезапускаем Instalation Manager и идем в пункт Файл -> Параметры. Добавляем хранилище из первого диска.
Нажимаем ОК и начинаем установку.
Убираем флажок с русского перевода.
Далее установщик попросит вставить диски 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 на просмотр. Если Вы увидели сообщение как показано ниже на скриншоте, то все произведенные выше действия Вы выполнили верно.
На этом я статью завершаю. Всем спасибо за внимание! Надеюсь она будет кому-то полезна.
Автор: lukdiman
Спасибо за отличную статью.
для просмотра сообщений MQ у IBM есть MQExplorer . бесплатно.
http://www-01.ibm.com/support/docview.wss?uid=swg24021041