Разработка MQ JMS приложения на Spring Boot +5




Разработчики приложений, работающие на Java, при использовании интерфейса JMS, часто предпочитают работать со Spring Framework. Spring может упростить написание кода новых приложений, предоставляя шаблоны для общих паттернов (templates for common patterns) и успешно используется в течение многих лет с классами MQ JMS. Класс Spring JmsTemplate является ключевым интерфейсом, но он по-прежнему зависит от конфигураций и зависимостей в коде.

Spring Framework включает в себя различные модули для различных нужд. Одним из таких компонентов является Spring Boot. Spring Boot стартеры удобно подтягивают все зависимости и библиотеки авто-конфигураций, необходимые для использования конкретной технологии. Это позволяет очень легко начать работу с новым приложением и технологией, быстрее, чем работать непосредственно с классами, такими как JmsTemplate. Итак, как мы можем воспользоваться этим легким доступом для приложений MQ?

Переведено @middle_java

Mark E Taylor
Опубликовано 03/04/2018 / Обновлено 12/06/2018
11 комментариев

В этой статье я описал, как непосредственно загрузить из Maven Central Repository Java классы MQ. А теперь мы воспользуемся этим для создания Spring Boot стартера для MQ. Вы можете скачать полные исходники модуля с GitHub.

Начнем работу с MQ Spring Boot


Прежде всего, нам нужен запущенный администратор очередей. Затем мы создадим приложение, которое обращается к этому администратору очередей.

Запуск администратора очередей в контейнере


Для быстрого начала работы можно использовать контейнер IBM MQ для разработчиков, в котором выполняются серверные процессы. При запуске этого контейнера создается по умолчанию несколько объектов и их определения (definitions) известны модулю авто-конфигурации. Значения по умолчанию соответствуют значениям, необходимым для администратора очереди контейнера.

Это означает, что можно запустить администратор очереди с помощью среды Docker и подключиться к нему без дополнительных настроек. Можно запустить контейнер в системе Linux с помощью следующей команды:

  docker run --env LICENSE=accept --env MQ_QMGR_NAME=QM1 \
             --publish 1414:1414 \
             --publish 9443:9443 \
             --detach \
             ibmcom/mq

Пример приложения


Здесь используется подход, соответствующий модели приложений JMS, приведенной в Руководстве Spring по началу работы с JMS. Я пошел по пути импорта этого проекта в рабочее пространство Eclipse и использовал процесс сборки gradle, но процесс на базе maven также работает. В качестве упражнения я использовал конфигурацию maven из командной строки вместо Eclipse IDE.
Этот же код из примера работает с MQ с минимальной модификацией:

  • Измените исходный поставщик сообщений (messaging provider) в списке зависимостей так, чтобы он указывал на пакет IBM MQ.
  • Измените имя очереди в Application.java (в примере используется «mailbox») на «DEV.QUEUE.1» — это очередь, предопределенная конфигурацией Developer в контейнере Docker. Если вы не используете дефолтные параметры конфигурации Developer, то вам придется либо установить имя очереди таким же, как и у существующей очереди, либо определить соответствующую новую очередь.

В измененном файле build.gradle, который управляет компиляцией теперь есть:

  dependencies {
    compile("com.ibm.mq:mq-jms-spring-boot-starter:+")
    compile("com.fasterxml.jackson.core:jackson-databind")
  }

Если вы предпочитаете использовать Maven, то соответствующая секция в pom.xml выглядит следующим образом:

<dependencies>
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
  </dependency>
  <dependency>
    <groupId>com.ibm.mq</groupId>
    <artifactId>mq-jms-spring-boot-starter</artifactId>
    <version>0.0.3</version>
  </dependency>
</dependencies>

Единственное реальное различие в том, что в конфигурации Maven указана конкретная версия модуля MQ Spring Boot.

Конфигурация по умолчанию


Имена атрибутов конфигурации MQ Boot Starter начинаются с префикса «ibm.mq». Атрибуты по умолчанию имеют значения

  ibm.mq.queueManager=QM1
  ibm.mq.channel=DEV.ADMIN.SVRCONN
  ibm.mq.connName=localhost(1414)
  ibm.mq.user=admin
  ibm.mq.password=passw0rd

Они соответствуют значениям по умолчанию контейнера Docker.

Дополнительные параметры конфигурации


Если у вас уже есть запущенный администратор очередей MQ, который вы хотите использовать, то вы можете легко изменить конфигурацию по умолчанию, указав переопределенные значения. Администратор очередей может быть локальным или даже сервисом, размещенным в IBM Cloud. Файл application.properties в Java проекте, является одним из способов вынесения во вне проекта этих атрибутов. Конфигурация вступает в силу без каких-либо изменений кода.

Укажите имя администратора очередей атрибутом:

ibm.mq.queueManager=QM1

Для клиентских подключений к администратору очередей необходимо также задать

ibm.mq.channel 
ibm.mq.connName

Если не заданы ни channel, ни connName, предполагается, что используется локальный администратор очередей. Компонент конфигурации также поддерживает некоторые связанные с TLS атрибуты. Они более подробно описаны в файле README, но их значения по умолчанию — null. Возможно, потребуется также установить

ibm.mq.user 
ibm.mq.password=passw0rd 

для переопределения значений по умолчанию. Эти атрибуты можно оставить пустыми для использования локального userid операционной системы без аутентификации, если это разрешено администратором очередей.

Пример содержимого файла application.properties:

  ibm.mq.queueManager=QM1
  ibm.mq.channel=SYSTEM.DEF.SVRCONN
  ibm.mq.connName=server.example.com(1414)
  ibm.mq.user=user1
  ibm.mq.password=passw0rd

После этого Spring Boot создаст ConnectionFactory, которую можно будет использовать для взаимодействия с администратором очередей.

Тестирование программы-примера


Запуск программы-примера можно выполнить с помощью команды gradle bootRun. Или с помощью maven запустите mvn package, а затем java -jar ./target/gs-messaging-jms.jar, чтобы выполнить программу. Вы должны увидеть следующее:



Здесь видно, как приложение положило сообщение («sending an email message»), а затем извлекло его.

Выводы


Использование Spring Boot Starter с MQ позволяет очень быстро начать работу. Затем, после запуска вашего первого приложения, можно расширить его для использования других функций MQ. После того, как вы это попробуете, можете дать обратную связь здесь или на странице GitHub issues.

Обновление — Июнь 2018


Ранее в этом году было выпущено крупное обновление Spring Boot Framework, известное как Boot 2. MQ Boot Starter был обновлен для работы с этой новой версией платформы. Конечно, все публично выпущенные версии этого кода доступны в Maven Central Repository. Для совместимости со Spring Boot 1 нужно продолжать использовать версию 0.0.4 этого артефакта; версия 2.0.0 совместима с Boot 2 и будет использоваться в качестве основы для любых будущих обновлений.

Теги jms, mq, mqseries, spring, spring boot

автор Mark E Taylor

11 комментариев к статье «Разработка MQ JMS приложения на Spring Boot»


(Переведены только полезные комментарии и комментарии с ответами)

3.
Horacio May 16, 2019
Марк, отличная работа.
Можно ли обрабатывать более одной очереди?
Я вижу, что префикс жестко закодирован в @ConfigurationProperties(prefix = «bm.mq»)

o Mark E Taylor May 17, 2019
Я действительно не понимаю вопроса. «Префикс» указывает на атрибуты конфигурации, которые в основном показывают, как подключиться к администратору очередей. Это не имеет ничего общего с очередями, которые приложение использует после подключения. Если вы действительно хотели спросить о подключении к нескольким администраторам очередей, см. github.com/ibm-messaging/mq-jms-spring/issues/7, чтобы увидеть, какие подходы применяют люди.

7.
Peter May 17, 2018
«Hello.Application» отсутствует, файлы находятся на github?

o Mark E Taylor June 12, 2018
Для извлечения и импорта образца приложения я использовал страницу «Spring Getting Started» (см. spring.io/guides/gs/messaging-jms), а затем внес незначительные изменения. По разным причинам я намеренно не хотел иметь здесь отдельную копию этого кода.

Переведено @middle_java.




К сожалению, не доступен сервер mySQL