JMS повідомлення в Java додатку

JMS (Java Message Service) є стандартом обміну повідомленнями між програмами. Java програми, виконані за технологією Java SE (standalone) або Java EE (WEB) можуть створювати, надсилати та отримувати JMS повідомлення. Програмне забезпечення, яке використовується для передачі повідомлень між програмами за стандартом JMS, формує черги повідомлень queue.

Надсилання повідомленьjava-додатками виконується в асинхронному режимі, тобто. процедура не чекає на відповідь від одержувача. Як одержувачі повідомлень, що організовують черги (queue), може бути або програмне забезпечення типу WebSphere MQ, що зв'язує програми через канал обміну повідомленнями, або WEB-контейнер типу JBoss, GlassFish, що забезпечують обмін повідомленнями між додатками контейнера, або каналами Інтернету з використанням JNDI.

У статті розглядаються приклади відправлення та отримання повідомлень з використанням як WEB-додатка (Java EE), так і standalone додатка (Java SE). Опис прикладів поділено на дві частини. На цій сторінці розглядається взаємодія WEB-програми з провайдером HornetQ. Взаємодія standalone Java програми з Websphere MQ розглядається тут.

Приклад обміну повідомленнями з сервером JBoss

У першому найпростішому WEB-додатку«jms-jboss»для відправки та отримання JMS повідомлень як контейнер буде використаний сервер додатків Wildfly версії 8.2 (раніше JBoss Application Server або JBoss AS).

Налаштування сервера програм Wildfly

Щоб використовувати Wildfly для обміну повідомленнями JMS, необхідно налаштувати його конфігураційний файл /standalone/configuration/standalone.xml. За промовчанням налаштування JMS не включені до конфігураційного файлу і їх потрібно визначити вручну. Але можна використовувати конфігураційний файлstandalone-full.xml, в якому сервер включає налаштування JMS провайдера HornetQ, що забезпечує створення відповідних черг та обмін повідомленнями.

У файл конфігурації standalone-full.xml до розділу секції додамо чергу. Дві черги (ExpiryQueue та DLQ) вже є у підрозділі . Додамо свою чергуtestQueueз JNDI 'jms/queue/test' :

Наприклад, досить було додати один елемент '', який працює всередині контейнера. Другий елемент "java:jboss/exported/jms/queue/test" може працювати поза контейнера, тобто. з іншого JVM. Для нього обов'язковою умовою є визначення на початку найменування "java:jboss/exported/". Можна було б звичайно використовувати й існуючі черги (ExpiryQueue та DLQ).

Примітка :DLQ (Dead Letter Queue) – це локальна черга, звана інакше як черга недоставлених повідомлень. Таку чергу створюють для кожного менеджера черг, щоб відловлювати надіслані повідомлення, пов'язані з проблемами в мережі або в одержувача.

Якщо не створити DLQ, помилки в програмах можуть відключати канали. У цьому випадку не тільки припиниться отримання повідомлень у черзі, але може порушитися робота і провайдера MQ, наприклад, не будуть отримані та виконані команди адміністратора. Рекомендується проектувати програми таким чином, щоб уникати таких сценаріїв. Крім того, слід проводити моніторинг DLQ, оскільки повідомлення, що надходять у цю чергу, найчастіше містять помилки.

Щоб стартувати Wildfly з конфігураційним файлом standalone-full.xml з IDE Eclipse необхідно відкрити вікно 'JBoss Runtime' і визначити значення 'Configuration file'. Для цього відкрийте вкладку Servers (Perspective Java EE) і двічі клацніть мишею на сервері Wildfly. У вікні Overview, що відкрилося, натиснітьна посилання 'Runtime Enviroment', в результаті чого буде відкрито вікно 'JBoss Runtime' :

повідомлення

Для запуску сервера додатків Wildfly не з IDE Eclipse c конфігураційним файлом standalone-full.xml можна використовувати командний файл, в якому визначити файл як параметр: ./standalone.sh -c standalone-full.xml

Наприкінці сторінки наведено Log сервера Wildfly, в якому показано створення відповідних черг та підключення MDB-об'єкта програми до адаптера HornetQ для отримання JMS повідомлень за підпискою.

Опис прикладу

На наступному скріншоті наведена структура WEB-додаткаjms-jboss, що включає:

  • ServiceServlet - сервлет, що використовується для надсилання та отримання JMS повідомлень;
  • Sender – відправник JMS повідомлень;
  • Receiver – MDB одержувач JMS повідомлень;
  • jquery-3.2.1.min.js – бібліотека jQuery для асинхронних ajax-дзвінків сервлета;
  • index.jsp – інтерфейсна сторінка програми.

Проект у середовищі IDE Eclipse із використанням maven представлений на наступному скріншоті.

додатку

Лістинг сервлету ServiceServlet

Сервлет ServiceServlet викликається зі сторінки index.jsp із браузера з використанням jQuery. Як параметри сервлет отримує 'prefix' повідомлення та команду 'mode'. Для надсилання JMS повідомлення сервлет використовує метод sendMessage класу Sender. Надіслані повідомлення сервер Wildfly відразу ж повертає передплатнику Receiver. Отримані повідомлення сервлет читає зі статичної колекції Receiver.messages, після чого її очищає.

Надіслані та отримані повідомлення сервлет оформляє у вигляді HTML-коду та повертає до браузера.

Лістинг дескриптора програми, web.xml

У дескрипторі програми web.xmlописується сервлет ServiceServlet та його URL (url-pattern) для виклику, а також сторінка програми, що відкривається за замовчуванням.

Лістинг класу відправника повідомлень Sender

Клас відправника створюється і «живе» разом із WEB-додатком згідно з анотацією @ApplicationScoped. При інсталяції відразу визначаються context і черга queue. Сервлет відправляє текстові повідомлення, викликаючи метод sendMessage.

Лістинг одержувача повідомлень Receiver

Тут слід кілька слів сказати проMDB(Message Driven Beans). Об'єкт MDB використовується для підтримки асинхронних комунікацій у додатку, як правило, у поєднанні з чергами. Клієнт надсилає повідомлення в чергу, а MDB об'єкт отримує ці повідомлення з черги підписки. Клієнт не може викликати MDB безпосередньо, зв'язок забезпечується за допомогою повідомлень JMS. MDB ніколи не відповідає клієнту.

Клас одержувача повідомлень оформлений як MDB об'єкт з використанням анотації, в якій визначено ряд параметрів, що включає черги JNDI 'jms/queue/test'. Одержувач реалізує інтерфейс javax.jms.MessageListener, за яким перевизначає методonMessage.

При появі в черзі 'jms/queue/test' повідомлення сервер додатків Wildfly відразу ж викличе методonMessageданого MDB-об'єкта і передасть йому як параметр повідомлення javax.jms.Message, текст якого буде збережено в колекції messages . Сервлет має прямий доступ до набору отриманих повідомлень messages з public і static модифікаторами.

Лістинг сторінки index.jsp

Інтерфейс сторінки в браузері наведено на наступному скріншоті.

java

Старт сервера Wildfly

Сервер програм Wildfly «логує» всю інформацію. При старті із IDE Eclipse ця інформація додаткововиводиться у консоль. Нижче наведено інформацію (у скороченому вигляді), пов'язану з налаштуванням сервером JMS черг та стартом програми «jms-jboss». У передостанньому рядку відображається підключення MDB (Message Driven Bean) 'Receiver' до провайдера HornetQ.

Завантажити приклад

Вихідний код розглянутого прикладу у вигляді проекту Eclipse за допомогою Maven можна завантажити тут (994 Кб).

Приклади взаємодії Java програми з Websphere MQ з надсилання та читання JMS повідомлень представлені тут.