
- •ЛабораторнаЯ рАбота 4
- •ЛабораторнаЯ рАбота 5 Создание корпоративной информационной системы на основе Java jms
- •1 Теоретическое введение
- •1.1 Архитектура jms-базированной кис
- •1.2 Сообщения
- •1.3 Модели передачи сообщений
- •1.4 Схема применения jms
- •Пример №1. Создания jms-базированной кис,
- •Часть 1.
- •Часть 2.
- •Часть 3.
- •Часть 4 (факультативно).
1.3 Модели передачи сообщений
JMS предоставляет две модели передачи сообщений (т.н. зоны сообщений (messaging domains)): «издание - подписка» (publish an subscribe) и «точка - точка» (point to point).
Модель передачи сообщений «издание - подписка»
Модель передачи сообщений «издание - подписка» (рисунки 5…6) определена в пакете javax.jms.Topic и используется в том случае, если сообщение, отправленное одним клиентом, должно быть получено несколькими другими клиентами.
Рисунок 5 - Модель взаимодействия клиентов по некоторой теме
Рисунок 6 – Буферизация сообщений в модели взаимодействия «издание - подписка»
При использовании модели взаимодействия «издание - подписка» один поставщик может посылать сообщения многим потребителям через виртуальный канал, называемый темой (topic).
Потребители могут выбрать подписку (subscribe) на любую тему. Все сообщения, направляемые в тему, передаются всем потребителям данной темы. Каждый потребитель принимает копию каждого сообщения. В JMS эта концепция реализуется с помощью специальных слушателей (listeners), регистрируемых в системе. При возникновении нового события слушатель, закрепленный за данной темой, возбуждается.
Следует отметить, что при использовании модели «издание - подписка» клиенты JMS могут устанавливать долговременные подписки, позволяющие потребителям отсоединяться и позже снова подключяться и получать сообщения, поступившие во время отключения связи.
TopicConnectionFactory
TopicConnectionFactory - управляемый ресурс, получаемый с помощью обращения к JNDI для получения доступа к провайдеру. С помощью его метода createTopicConnection() мы можем получить объект TopicConnection.
TopicConnection
TopicConnection – создает подключение к провайдеру. Методы TopicConnection приведены в таблице 2.
Таблица 2
Название метода |
Описание |
createTopicSession (boolean, int) |
Метод возвращает объект TopicSession. Первый логический параметр указывает на то, будет ли сессия помечена как «transacted», второй целочисельный параметр — тип уведомления о доставке |
start( ) |
Активирует получение сообщений от провайдера |
stop( ) |
Временно приостанавливает получение сообщений, возобновить которое можно повторным вызовом метода start() |
close( ) |
Закрывает соединение с провайдером и высвобождает все задействованные ранее ресурсы. |
TopicSession
TopicSession – однопоточный контекст для получения сообщений. Методы TopicSession приведены в таблице 3.
Таблица 3
Название метода |
Описание |
createPublisher(Topic) |
Возвращает объект TopicPublisher для отправки сообщений в определенную тему |
createSubscriber(Topic) |
Возвращает TopicSubscriber, объект для получения сообщений из определенной темы. Сообщения будут приходить до тех пор, пока существует сам объект.
|
createDurableSubscriber (Topic, String) |
Возвращает TopicSubscriber, одновременно именуя подписку с помощью переданного второго параметра. Даже если подписчик неактивен, JMS сохранит их и доставит при первой же активации объекта или создании нового с таким же именем. |
unsubscribe(String) |
Отписывает от темы с заданным именем |
commit( ) |
Подтверждает все входящие или исходящие сообщения |
rollback( ) |
Откатывает все входящие или исходящие сообщения |
create<тип сообщения> Message(...) |
Набор методов для создания сообщений определенного типа |
Topic
Topic представляет собой хранилище сообщений и так же, как и TopicConnectionFactory, является управляемым объектом.
TopicPublisher
TopicPublisher — объект, использующийся для отправки сообщений. Некоторые из основных методов TopicPublisher приведены в таблице 4.
Таблица 4
Название метода |
Описание |
publish(Message) |
Публикует указанное сообщение |
setDeliveryMode(int) |
Устанавливает тип доставки сообщения:
|
setPriority(int) |
Устанавливает приоритет отправленного сообщения. В качестве параметра можно передать целое число в диапазоне от 0…9. |
setTimeToLive(long) |
Устанавливает время жизни отправляемого сообщения. |
TopicSubscriber
TopicSubscriber используется для получения сообщений. Некоторые из основных методов TopicSubscriber приведены в таблице 5.
Таблица 5
Название метода |
Описание |
receive( ) |
Получает очередное сообщение. Метод блокируется до тех пор, пока сообщение не будет получено. |
receive(long) |
Получает очередное сообщение. При этом указывается интервал времени ожидания. Если сообщение не приходит в течение указанного количества миллисекунд, метод возвращает null. |
receiveNoWait( ) |
Получает очередное сообщение. Если оно сразу же не было доступно, то метод просто завершает работу, ничего не возвращая. |
setMessageListener (MessageListener) |
Устанавливает слушателя (MessageListener), который получает сообщения асинхронно. |
Отметим также, что существуют прочная (durable) и непрочная (non-durable) подписки. Прочная подписка (рисунок 7) гарантирует, что подписчик получит все сообщения, посланные в теме, а непрочная подписка не дает никаких гарантий насчет тех сообщений, которые были отосланы в момент, когда клиент был отключен от темы (рисунок 8).
Рисунок 7 - Прочная подписка. Все сообщения будут обработаны
Рисунок 8 - Непрочная подписка (сообщения M3 и M4 не будут обработаны)
Модель передаче сообщений «точка - точка»
Модель передаче сообщений «точка - точка» (point to point) (рисунок 9) определена в пакете javax.jms.Queue и служит для реализации обмена сообщениями между двумя компонентами.
Модель передачи сообщений «точка - точка» предоставляет возможность JMS-клиентам посылать и принимать сообщения (как синхронно, так и асинхронно) через виртуальные каналы, называемые очередями (queues). Модель основывается на методе опроса, при котором сообщения явно запрашиваются (считываются) JMS-клиентом из очереди. Несмотря на то, что чтение из очереди могут осуществлять несколько JMS-клиентов, каждое сообщение будет прочитано только единожды – JMS-провайдер JMS это гарантирует.
Рисунок 9 - Модель взаимодействия «точка - точка»
QueueConnectionFactory
QueueConnectionFactory – управляемый объект, получаемый из JNDI для создания подключения к провайдеру. QueueConnectionFactory содержит метод генерации createQueueConnection( ), возвращающий объект QueueConnection.
QueueConnection
QueueConnection представляет активное подключение к провайдеру. Некоторые из методов, присущих QueueConnection, перечислены в таблице 6.
Таблица 6
Название метода |
Описание |
createQueueSession (boolean, int) |
Метод возвращает объект QueueSession. Первый логический параметр указывает на то, будет ли сессия помечана как «transacted», второй целочисельный параметр — тип уведомления о доставке сообщения |
start( ) |
Активирует получение сообщений от провайдера |
stop( ) |
Временно приостанавливает получение сообщений, возобновить которое можно повторным вызовом метода start( ) |
close( ) |
Закрывает соединение с провайдером и высвобождает все задействованные ранее ресурсы. |
QueueSession
QueueSession — однопоточный контекст для отсылки и приема сообщений. Методы QueueSession приведены в таблице 7.
Таблица 7
Название метода |
Описание |
createSender(Queue) |
Возвращает объект QueueSender, служащий для передачи сообщений в определенное хранилище (в данном случае, представленное в виде очереди)
|
createReceiver(Queue) |
Возвращает объект QueueReceiver, служащий для приема сообщений из определенного хранилища (в данном случае, представленного в виде очереди) |
createBrowser(Queue) |
Возвращает объект QueueBrowser, служащий для тех же целей, что и QueueReceiver |
commit( ) |
Подтверждает все входящие или исходящие сообщения |
rollback( ) |
Откатывает все входящие или исходящие сообщения |
create<тип сообщения> Message(...) |
Набор методов для создания сообщений определенного типа |
Queue
Queue инкапсулирует хранилище сообщений. Это управляемый объект, доступ к которому можно получить посредством JNDI.
QueueSender
QueueSender – объект, используемый для посылки сообщений. Методы QueueSender приведены в таблице 8.
Таблица 8
Название метода |
Описание |
send(Message) |
Отсылает указанное сообщение |
setDeliveryMode(int) |
Устанавливает тип доставки сообщения:
|
setPriority(int) |
Устанавливает приоритет отправленного сообщения. В качестве параметра можно передать целое число в диапазоне от 0…9 |
setTimeToLive(long) |
Устанавливает время жизни отправляемого сообщения. |
QueueReceiver
QueueReceiver служит для получения сообщений из очереди. Методы QueueReceiver приведены в таблице 9.
Таблица 9
Название метода |
Описание |
receive( ) |
Получает очередное доставленное сообщение. Метод блокируется до тех пор, пока сообщение не будет получено. |
receive(long) |
Получает очередное сообщение. При этом указывается интервал времени ожидания. Если сообщение не приходит в течение указанного количества миллисекунд, метод возвращает null. |
receiveNoWait( ) |
Получает очередное сообщение. Если оно сразу же не было доступно, то метод просто завершает работу, ничего не возвращая. |
setMessageListener (MessageListener) |
Устанавливает слушателя (MessageListener), который получает сообщения асинхронно. |
QueueBrowser
При использовании QueueReceiver для получения сообщений, сообщения удаляются по мере своей обработки. В отличие от QueueReceiver, QueueBrowser просматривает сообщения в очереди, однако не удаляет их. Для этого существует метод getEnumeration( ), который возвращает перечисление java.util.Enumeration, которое может быть использовано для просмотра сообщений в очереди.
MessageListener
MessageListener — интерфейс с единственным методом – onMessage(Message), - который обеспечивает асинхронный прием и обработку сообщений. Интерфейс должен быть реализован клиентским классом, объекты которого могут передаваться в метод setMessageListener(MessageListener) объектов QueueReceiver. Как только сообщение приходит в очередь, вызывается метод onMessage(Message).
Объекты MessageListener используются в обеих моделях передачи сообщений.