WebSphere MQ для начинающих

в 11:22, , рубрики: java, jms, WebSphere, Песочница, разработка, метки: , ,

Введение

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

Осторожно трафик!

Установка и настройка WebSphere и WebSphere MQ

Надеюсь Вы уже скачали все необходимые программы и готовы приступить к установке. Первым делом запустите установщик IBM Installation Manager. Дабы не увеличивать размер статьи скриншоты, которые не имеют особой смысловой нагрузки, буду убирать в спойлеры, т.к. полностью удалить из статьи считаю неправильно т.к. они дают понимание что Вы делаете все правильно.

Скриншоты

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

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

WebSphere MQ для начинающих

Нажимаем ОК и начинаем установку.

Скриншоты с описанием

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

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

WebSphere MQ для начинающих

WebSphere MQ для начинающих

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

WebSphere MQ для начинающих

WebSphere MQ для начинающих

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

WebSphere MQ для начинающих

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

Скриншоты

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

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

Скриншоты

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

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

WebSphere MQ для начинающих

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

WebSphere MQ для начинающих

Для того чтобы создать наши входящую и исходящую очереди запустим 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 (Как показано на скриншоте ниже).
WebSphere MQ для начинающих
Далее вводим имя и jndi имя.

WebSphere MQ для начинающих

WebSphere MQ для начинающих
Вписываем имя queue manager-а.

WebSphere MQ для начинающих

WebSphere MQ для начинающих
Если при проверке соединения возникает сообщение(которое показано на скриншоте ниже), то произведите следующие действия.

  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. Теперь все должно заработать

WebSphere MQ для начинающих

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

WebSphere MQ для начинающих

WebSphere MQ для начинающих

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

WebSphere MQ для начинающих

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

WebSphere MQ для начинающих

Сохраняем конфигурацию. Мы указали 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 баги и не освобождаются ресурсы если отправлять сообщение из файла (лочит намертво), но жить с ними можно.

И так, приступим к установке и настройке.

Скриншоты

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

WebSphere MQ для начинающих

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

WebSphere MQ для начинающих

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

WebSphere MQ для начинающих

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

WebSphere MQ для начинающих

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

WebSphere MQ для начинающих

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

Автор: lukdiman

Источник


  1. Андрей:

    Спасибо за отличную статью.

  2. иван:

    для просмотра сообщений MQ у IBM есть MQExplorer . бесплатно.
    http://www-01.ibm.com/support/docview.wss?uid=swg24021041

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js