Новые статьи и уроки JAVAJMS: Введение в технологию и установка ActiveMQ сервера.
|
ConnectionFactory | Объект, создающий Connection. В параметре инициализации нужно передавать данные вашего JMS сервера. |
Connection | Соединение с сервером JMS. Создает объект Session. |
Session | Контекст реализующий передачу и получение сообщений. Управляет транзакцией в JMS и его использование разными потоками невозможно или ограничено. Рекомендуется создавать разные Session для каждого потока. Создает объект Destination. |
Destination | Объект, хранящий адреса сообщений (имя топика или очереди). С его помощью создаются объекты, отвечающие за отсылку сообщений на конкретно указанный адресат и их получения оттуда. |
MessageProducer | Объект для отправки сообщений. |
MessageConsumer | Объект для получения сообщений. |
Алгоритм создания программ, работающих с JMS
Весь алгоритм, при желании, можно просчитать по таблице интерфейсов:
- Подключаемся к серверу, используя ConnectionFactory.
- Получаем соединение Connection из ConnectionFactory.
- Создаем однопоточный контекст Session из соединения.
- Получаем буфер Destination привязанный к определенному адресу для создания интерфейсов отправки и получения сообщений.
- Создание объектов MessageProducer для отправки или MessageConsumer для получения сообщений.
- Отдельно идет этап создания сообщения для отправки.
Сообщения в JMS
Сообщения в JMS бывают следующего типа:
StreamMessage | Как видно из названия, это поток примитивных типов Java. Считывать можно со стандартных интерфейсов ввода/вывода. |
MapMessage |
Содержит информацию на подобии коллекций в виде ключ-значение (String, Object). |
TextMessage | Обычное, текстовое сообщение. |
ObjectMessage | Для передачи Serializable-объектов. Можете передавать сразу классы. |
BytesMessage | Список не интерпретированных байт. С его помощью можно передавать файлы. |
Любое JMS сообщение имеет в себе 3 составные части:
- Заголовок (header). Набор свойств, поставляемый по умолчанию для любого сообщения, в их числе информация об отправителе, получателе, о самом сообщение и др. Подробнее о свойствах заголовков ниже.
- Свойства (properties). Дополнительный набор свойств, составляемый разработчик.
- Тело (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 все будет очень просто:
- Скачиваем архив сервера с сайта.
- Разархивируем архив и в папке bin запустим bat файл activemq.bat.
Для пользователей Linux задача чуть усложнится. Приведу пример установки на ОС Ubuntu:
- Также скачиваем архив с сайта.
wget http://www.apache.org/dyn/closer.cgi?path=%2Factivemq%2Fapache-activemq%2F5.7.0%2Fapache-activemq-5.7.0-bin.tar.gz
- Разархивируем его
sudo tar xvfz apache*.tar.gz
- Перейдем в созданный каталог, там найдем папку bin и в ней выполним команду для создания файла настроек сервера:
sudo ./activemq setup /etc/default/activemq
- Если Вы последнее время сильно не грешили, то ActiveMQ должен запуститься командой:
Я, по-видимому, был грешен с головы до пят, и потому были проблемы с запуском, но это частный случай конфликта настроек и у Вас он едва ли возможен.sudo ./activemq start
Сейчас сервер ActiveMQ запущен и готов принимать сообщения на порту 61616.
Знакомство с сервером ActiveMQ
Уже сейчас, Вы можете протестировать сервер, отправляя и получая сообщения, используя веб-консоль, которая находится на порту 8161 (http://localhost:8161).
Поисследуйте возможности этой веб-консоли. Посмотрите примеры реализации некоторых способов связи с сервером.
В следующей статье мы научимся посылать и принимать различные сообщения из нашего веб-приложения, используя стандартные интерфейсы javax.jms.*, поставляемые с JavaEE 6.
Комментарии
ActiveMQ - это не менеджер очередей - это брокер