Введение


В рамках одной из задач было необходимо интегрироваться с внешней системой. В проме и у всех разработчиков стоит 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 команды:
  1. DEFINE QLOCAL(HOME.TO.ES) — очередь для отправки сообщений из нашего приложения во внешнюю систему
  2. DEFINE QLOCAL(ES.TO.HOME) — очередь для приема сообщений из внешней системы

Осталось создать слушатель и канал и запустить его и WebSphere MQ можно считать настроеной. Для этого выполните следующие команды:
  1. DEFINE LISTENER(HABR_QUEUE_MANAGER.LISTENER) TRPTYPE (TCP) PORT(1414)
  2. START LISTENER(HABR_QUEUE_MANAGER.LISTENER)
  3. 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-а.




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



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



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