JMS: Введение в технологию и установка ActiveMQ сервера.
Поиск по сайту:
О разработчеке сайта
Header image

Новые статьи и уроки JAVA

JMS: Введение в технологию и установка ActiveMQ сервера.

В этой и следующей статье пойдет речь о технологии Java Message Service (JMS). JMS - это система передачи сообщений, изначально разработанная компанией Sun, чтобы предоставить разработчикам создавать гибкие и слабосвязанные приложения с использованием асинхронного обмена данными между приложениями (клиентами/серверами) через посредника. Асинхронность - это главная причина создания и использования JMS.

Принцип работы

Общий алгоритм работы с JMS весьма простой: некое приложение (поставщик) хочет передать данные другому приложению, или даже нескольким приложениям (получатель). Поставщик отправляет свое сообщение на JMS сервер, получатель же проверяет JMS сервер на наличие для него сообщений и считывает их, если таковые имеются.

В жестком связывании обмен происходил бы без использования посредника напрямую, а поставщик устанавливает соединение с получателем и передает ему сообщение используя это соединение.

При жестком связывании имеются две главные проблемы, которые и решает JMS:

  • Один поставщик - один получатель. Для реализации многопользовательской рассылки, необходимо поставщику установить соединение с каждым из получателей.
  • Синхронность. Передача сообщением поставщиком возможно только при рабочем получателе и наличия с  ним соединения.

При использовании JMS вовсе не обязательно условие рабочего получателя. Поставщик отправляет сообщение на сервер, где оно хранится указанное время или до его получения получателем. JMS сервер может самостоятельно рассылать одно и тоже приложение всем получателям (если получателей больше 1), что снимает большой объем работы с поставщика.

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

Модели передачи сообщений

В JMS имеется две модели (домена) передачи сообщений и соответственно для этого используются два вида объекта:

  • Модель Точка-Точка (Point-to-Point). Объект Queue.
  • Модель Подписчик-Издатель (Publisher-Subscriber). Объект Topic.

В модели PtP одно сообщение имеет одного и только одного получателя (классика корпоративного обмена сообщениями). Если к объекту Queue подключено больше одного получателя, ожидающих сообщения, то сообщение дойдет только одному из них, кто раньше его попросит (если не указан конкретный получать).

В модели Pub/Sub сообщение получает каждый подписчик.

1Итак, если Вас кто-то спросит, чем отличается домен Queue от Topic, Вы смело, глядя собеседнику в глаза, ответите: Queue реализует модель PtP и одно сообщение может получить только один получатель, а Topic реализует модель Pub-Sub, что позволяет отсылать одно сообщение множеству клиентов.

Интерфейсы JMS

В версии JMS 1.0 были различные интерфейсы для каждого из домена. С выходом JMS 1.1 появился общий, унифицированный интерфейс для работы с одновременно двумя доменами. Рассмотрим главные интерфейсы:

Интерфейсы JMS
ConnectionFactory Объект, создающий Connection. В параметре инициализации нужно передавать данные вашего JMS сервера.
Connection Соединение с сервером JMS. Создает объект Session.
Session Контекст реализующий передачу и получение сообщений. Управляет транзакцией в JMS и его использование разными потоками невозможно или ограничено. Рекомендуется создавать разные Session для каждого потока. Создает объект Destination.
Destination Объект, хранящий адреса сообщений (имя топика или очереди). С его помощью создаются объекты, отвечающие за отсылку сообщений на конкретно указанный адресат и их получения оттуда.
MessageProducer Объект для отправки сообщений.
MessageConsumer Объект для получения сообщений.


Алгоритм создания программ, работающих с JMS

Весь алгоритм, при желании, можно просчитать по таблице интерфейсов:

  1. Подключаемся к серверу, используя ConnectionFactory.
  2. Получаем соединение Connection из ConnectionFactory.
  3. Создаем однопоточный контекст Session из соединения.
  4. Получаем буфер Destination привязанный к определенному адресу для создания интерфейсов отправки и получения сообщений.
  5. Создание объектов MessageProducer для отправки или MessageConsumer для получения сообщений.
  6. Отдельно идет этап создания сообщения для отправки.

Сообщения в JMS

Сообщения в JMS бывают следующего типа:

Типы JMS сообщений
StreamMessage Как видно из названия, это поток примитивных типов Java. Считывать можно со стандартных интерфейсов ввода/вывода.
MapMessage

Содержит информацию на подобии коллекций в виде ключ-значение (String, Object).

TextMessage Обычное, текстовое сообщение.
ObjectMessage Для передачи Serializable-объектов. Можете передавать сразу классы.
BytesMessage Список не интерпретированных байт. С его помощью можно передавать файлы.

Любое JMS сообщение имеет в себе 3 составные части:

  1. Заголовок (header). Набор свойств, поставляемый по умолчанию для любого сообщения, в их числе информация об отправителе, получателе, о самом сообщение и др. Подробнее о свойствах заголовков ниже.
  2. Свойства (properties). Дополнительный набор свойств, составляемый разработчик.
  3. Тело (body). Само содержимое сообщения.

Заголовок JMS сообщения

Все параметры заголовка сообщения имеют префикс JMS
Методы установки и считывания их свойств будут выглядеть соответственно setJMS и getJMS.

Параметры заголовка сообщения
Наименование Тип Описание
JMSMessageID String Параметр идентификации сообщения.
JMSDestination String Адрес передачи сообщения.
JMSDeliveryMode int Может иметь только два значения: DeliveryMode.PERSISTENT и DeliveryMode.NON_PERSISTENT. Персистентное сообщение доставляется "один раз и только один раз"; не персистентное сообщение доставляется "не более одного раза". "Не более одного раза" подразумевает возможность отсутствия доставки. Для гарантирования отсутствия влияния системных сбоев на доставку персистентных сообщений должны выполняться дополнительные действия. Для передачи персистентных сообщений часто необходимы значительные дополнительные накладные расходы, и нужно тщательно рассматривать баланс между надежностью и производительностью при выборе режима доставки сообщения.
JMSTimestamp long Время доставки сообщения JMS серверу для последующей передачи.
JMSExpiration long Время жизни сообщения. 0 - означает что сообщение будет жить пока оно не будет доставлено.
JMSPriority int Приоритет сообщения от 0 (самый ничтожный) до 9 (наивысший приоритет).
JMSCorrelationID String Необходимо для связи ответного сообщения с определенным сообщением-запросом. В это поле помещается JMSMessageID сообщения, на которое необходим ответ.
JMSReplyTo Destination Указание места, куда должно быть передано ответное сообщение. Например, все вопросы вы помещаете в топик question, а ответы на них хотите видеть в топике response.
JMSType String Тип сообщения.
JMSRedelivered  Boolean  Означает, что сообщение было доставлено получателю, но он не подтвердил прием сообщения.

Транзакции в JMS

В JMS возможны транзакционные отправки сообщения. В этом случае сообщения группируются и отправляются внутри одной транзакции; если произошла ошибка, то все действия отменяются, вся отправка и получение сообщений, которые были внутри транзакций, аннулируются. Чтобы воспользоваться транзакцией, необходимо создать объект Session, поддерживающий транзакцию.

Возможна кроссдоменная транзакция с использованием JTA.

Пока с теорией закончим. Мы поняли, что это за зверь - JMS, его отличительные особенности и внутреннюю архитектуру.

JAAS

Для аутентификации и авторизации клиентов, во всех MQ серверах возможно использование технологии JAAS. С ней можно познакомиться в одной из статей из серии JavaEE.

Выбор MQ сервера

Используемый нами ранее в JavaEE проектах Glassfish-сервер поддерживает возможность реализации JMS. Однако в реальных "боевых" условиях, поставляемый стандартный функционал JMS от GlassFish практически не используется. Как правило, сервер приложений и сервер сообщений - это абсолютно два разных процесса и расположены на разных машинах. Чаще всего вам придется сталкиваться с другими популярными MQ серверами, такими как:

  • Apache ActiveMQ Server
  • WebShpere MQ Server

По большому счету самой программе (не MQ серверу) неважно какому из серверов отправлять сообщения, внутренний код программы не изменится, или изменится незначительно, ведь JMS - это спецификация, и методы работы с JMS меняться не должны.

В нашем случае мы будем использовать ActiveMQ сервер от Apache.

Установка ActiveMQ сервера

 Для пользователей Windows все будет очень просто:

  1. Скачиваем архив сервера с сайта.
  2. Разархивируем архив и в папке bin запустим bat файл activemq.bat.

Для пользователей Linux задача чуть усложнится. Приведу пример установки на ОС Ubuntu:

  1. Также скачиваем архив с сайта.
    wget http://www.apache.org/dyn/closer.cgi?path=%2Factivemq%2Fapache-activemq%2F5.7.0%2Fapache-activemq-5.7.0-bin.tar.gz
    Загрузка activeMQ
  2. Разархивируем его
    sudo tar xvfz apache*.tar.gz
  3. Перейдем в созданный каталог, там найдем папку bin и в ней выполним команду для создания файла настроек сервера:
    sudo ./activemq setup /etc/default/activemq
  4. Если Вы последнее время сильно не грешили, то ActiveMQ должен запуститься командой:
    sudo ./activemq start
    Я, по-видимому, был грешен с головы до пят, и потому были проблемы с запуском, но это частный случай конфликта настроек и у Вас он едва ли возможен.

Сейчас сервер ActiveMQ запущен и готов принимать сообщения на порту 61616.

 Знакомство с сервером ActiveMQ

Уже сейчас, Вы можете протестировать сервер, отправляя и получая сообщения, используя веб-консоль, которая находится на порту 8161 (http://localhost:8161).

ActiveMQ веб-консоль
Поисследуйте возможности этой веб-консоли. Посмотрите примеры реализации некоторых способов связи с сервером.

В следующей статье мы научимся посылать и принимать различные сообщения из нашего веб-приложения, используя стандартные интерфейсы javax.jms.*, поставляемые с JavaEE 6.

 

14.12.2012

Комментарии

ActiveMQ - это не менеджер очередей - это брокер

22.02.2015 Автор: Сергей