Проект

Общее

Профиль

JMS » История » Версия 3

Александр Александров, 24.04.2019 00:37

1 1 Александр Александров
h1. JMS
2
3
h2. Вопросы
4
5
# Что такое JNDI?
6
# Что такое JMS?
7
# Что такое MOM?
8
# Из каких компонентов состоит архитектура обмена сообщениями?
9
# Какие модели обмена сообщениями в JMS вы знаете? Опишите их.
10
# Назовите основные интерфейсы JMX, для чего они предназначены.
11
# Как выглядит алгоритм создания программ, работающих с JMS?
12
# Какие стандартные типы сообщений определены JMX?
13
# Из каких частей JMS сообщение?
14
# Какие параметры может содержать заголовок сообщения?
15
# Какие модели подтверждения получения сообщения вы знаете?
16
17
h2. Ответы
18
19
h3. Что такое JNDI?
20
21 2 Александр Александров
JNDI - это API-интерфейс для доступа к службам каталогов, позволяющий клиентам осуществлять привязку и поиск объектов по имени. JNDI определяется в Java SE и не зависит от базовой реализации, то есть вы можете выполнять поиск объектов в каталоге Lightweight Directory Access Protocol (LDAP) или системе доменных имен (DNS), используя стандартный API-интерфейс.
22
23 1 Александр Александров
h3. Что такое JMS?
24
25 2 Александр Александров
JMS, Java Message Service - это Java API (то есть набор интерфейсов и классов) для работы с Message-Oriented Middleware, изначально разработанная компанией Sun, чтобы предоставить разработчикам создавать гибкие и слабосвязанные приложения с использованием асинхронного обмена данными между приложениями (клиентами/серверами) через посредника. Асинхронность - это главная причина создания и использования JMS.
26
27
Данный набор определен в пакете javax.jms в дереве пакетов J2EE. JMS поддерживает две модели обмена сообщениями: point-to-point(точка - точка) и publishsubscribe(издатель-подписчик).
28
29 1 Александр Александров
h3. Что такое MOM?
30
31 2 Александр Александров
MOM, Message-Oriented Middleware (промежуточное программное обеспечение) - подпрограммное обеспечение промежуточного слоя, ориентированное на обмен сообщениями в распределённом окружении. Прежде всего предназначено для реализации отложенного обмена сообщениями, на основе которого и строится Messaging System.
32
33
В отличие от традиционных систем, в Messaging System приложения общаются не напрямую, а посредством MOM. Если один компонент системы хочет послать сообщение другому компоненту, он посылает данное сообщение MOM, а MOM затем пересылает его адресату.
34
35 1 Александр Александров
h3. Из каких компонентов состоит архитектура обмена сообщениями?
36
37 2 Александр Александров
На высоком уровне архитектура обмена сообщениями состоит из следующих
38
компонентов.
39
40
* Поставщик. JMS - это только API, поэтому он нуждается в реализации способа обмена сообщениями, то есть в поставщике (также известном как брокер сообщений). Поставщик обрабатывает буферизацию и доставку сообщений.
41
* Клиенты. Клиентом является любое приложение Java или компонент, который производит или потребляет сообщение с помощью поставщика. "Клиент" - это общий термин для производителя, отправителя, издателя, потребителя, приемника и подписчика.
42
* Сообщения. Это объект, которые клиенты отправляют или получают от поставщика.
43
* Администрируемые объекты. Брокер сообщений должен предоставить клиенту администрируемые объекты (фабрики подключений и места назначения) с помощью поиска JNDI или внедрения (как вы увидите далее).
44
45 1 Александр Александров
h3. Какие модели обмена сообщениями в JMS вы знаете? Опишите их.
46
47 2 Александр Александров
Существует две "основных" модели обмена сообщениями:
48
49
* Модель Точка-Точка (Point-to-Point, P2P) - в этой модели место назначения, используемое для хранения сообщений, называется очередью. Объект Queue. В этой модели один клиент помещает сообщение в очередь, а другой получает сообщение. Как только получение сообщения подтверждено, поставщик сообщений удаляет его из очереди.
50
* Модель Подписчик-Издатель (Publisher-Subscriber) - место назначения называется темой. Объект Topic. При использовании данной модели клиент публикует сообщение в теме и все абоненты этой темы получают сообщение.
51
52 1 Александр Александров
h3. Назовите основные интерфейсы JMX, для чего они предназначены.
53
54 2 Александр Александров
Рассмотрим главные интерфейсы:
55
56
* ConnectionFactory - это обьект, ответственный за создание JMS Connection. Администратор МОМ создает данный обьект и связывает его с деревом JNDI, так что клиент JMS может получить доступ к ConnectionFactory используя стандартный JNDI lookup-механизм. В параметре инициализации нужно передавать данные вашего JMS сервера. В случае point-to-point модели используется javax.jms.QueueConnectionFactory, в случае pub-sub модели - javax.jms.TopicConnectionFactor.
57
* Connection - абстрактное представление реального соединения между клиентом JMS и MOM. Создает объект Session. В случае point-to-point модели используется javax.jms.QueueConnection, в случае pub-sub модели - javax.jms.TopicConnection.
58
* Session - объект, создаваемый JMS Connection и используемый клиентами для посылки и принятия сообщений. В случае point-to-point используется javax.jms.QueueSession, в случае pub-sub - javax.jms.TopicSession. Фактически, это главная "рабочая лошадка" JMS.
59
* Destination - это либо queue, либо topic - в зависимости от используемой модели: javax.jms.Queue или javax.jms.Topic. Как и ConnectionFactory, destination связывается с деревом JNDI.
60
* MessageProducer - обьект, который, собственно, и посылает сообщения. В случае point-to-point модели это javax.jms.QueueSender, в случае pub-sub - javax.jms.TopicPublisher.
61
* MessageConsumer - обьект, принимающий сообщения. В случае point-to-point модели это javax.jms.QueueReceiver, в случае pub-sub - javax.jms.TopicSubscriber.
62
* Message - сообщение. О типах сообщений будет сказано ниже.
63
64 1 Александр Александров
h3. Как выглядит алгоритм создания программ, работающих с JMS?
65
66 2 Александр Александров
Весь алгоритм, можно просчитать по таблице интерфейсов. Выглядит он так:
67
68
* Подключаемся к серверу, используя ConnectionFactory.
69
* Получаем соединение Connection из ConnectionFactory.
70
* Создаем однопоточный контекст Session из соединения.
71
* Получаем буфер Destination привязанный к определенному адресу для создания интерфейсов отправки и получения сообщений.
72
* Создание объектов MessageProducer для отправки или MessageConsumer для получения сообщений.
73
* Отдельно идет этап создания сообщения для отправки.
74
75 1 Александр Александров
h3. Какие стандартные типы сообщений определены JMX?
76
77 2 Александр Александров
В JMX определены следующие стандартные типы сообщений:
78
79
* StreamMessage - это поток примитивных типов Java. Считывать можно со стандартных интерфейсов ввода/вывода.
80
* MapMessage - содержит информацию на подобии коллекций в виде ключ-значение (String, Object).
81
* TextMessage - обычное текстовое сообщение содержащее строку.
82
* ObjectMessage - для передачи Serializable-объектов.
83
* ByteMessage - список не интерпретированных байт. С его помощью можно передавать файлы.
84
85
Кроме того, некоторые имплементации (например, OpenFusion и WebLogic) предоставляют еще один "почти стандартный" тип:
86
87
* XMLMessage - расширение TextMessage, используется для доставки XMLсообщений
88
89
Все типы сообщений являются подклассами javax.jms.Message.
90
91 1 Александр Александров
h3. Из каких частей JMS сообщение?
92
93 2 Александр Александров
Любое JMS сообщение имеет в себе 3 составные части:
94
95
* Заголовок (header). Набор свойств, поставляемый по умолчанию для любого сообщения, содержит стандартную информацию для идентификации и маршрутизации сообщений.
96
* Свойства (properties). Пары «имя/значение», которые приложение может установить или считать; свойства также позволяют месту назначения фильтровать сообщения на основе их значений.
97
* Тело (body). фактически содержит сообщение и может иметь один из нескольких форматов (текст, байты, объект и т. д.).
98
99 1 Александр Александров
h3. Какие параметры может содержать заголовок сообщения?
100
101 2 Александр Александров
Заголовок сообщения содержит дополнительную информацию, которую разработчик может использовать в своем приложении. JMS предоставляет get и set методы для каждого поля заголовка. Некоторые из них устанавливаются автоматически, другие могут быть использованы разработчиком приложения.
102
103
* JMSDestination(тип String) - содержит имя destination, в который посылается сообщение.
104
* JMSDeliveryMode (тип int) - определяет, является ли сообщение сохраняемым или нет. Может иметь только два значения: DeliveryMode.PERSISTENT и DeliveryMode.NON_PERSISTENT. Персистентное сообщение доставляется "один раз и только один раз"; не персистентное сообщение доставляется "не более одного раза". "Не более одного раза" подразумевает возможность отсутствия доставки.
105
* JMSExpiration (тип long) - определяет, когда сообщение устареет и будет удалено из системы. 0 - означает что сообщение будет жить пока оно не будет доставлено.
106
* JMSPriority (тип int) - как и следует из названия, определяет приоритет сообщения (от 0 до 9). По умолчанию равно 4.
107
* JMSMessageID (тип String) - уникальный идентификатор сообщения
108
* JMSTimestamp (тип long)- содержит информацию, когда именно MOM приняла сообщение от producer.
109
* JMSCorrelationID (тип String) - может быть использовано разработчиком для согласования сообщений: например, если вы хотите переслать ряд сообщений, обьединенных в одну логическую группу (такую как набор товаров в заказе, при этом в каждое сообщение о товаре вы можете добавить в данное поле заголовка номер заказа).
110
* JMSReplyTo (тип Destination) - может быть использовано разработчиком для того, чтобы consumer знал, кому (то есть в какой destination) при желании отсылать ответ.
111
* JMSType (тип String) - поле может быть использовано разработчиком для того, чтобы дать приложению информацию, как обращаться с данным сообщением. Тип здесь понимается как application-speciÙc type, а не тот, что использован выше в разделе "типы сообщений".
112
* JMSRedelivered (тип Boolean) - означает, что сообщение было доставлено получателю, но он не подтвердил прием сообщения.
113
114 1 Александр Александров
h3. Какие модели подтверждения получения сообщения вы знаете?
115 2 Александр Александров
116
JMS поддерживает три "основных" модели подтверждения получения сообщения.
117
118
* AUTO_ACKNOWLEDGE - в случае синхронного получения сообщений, подтверждение получения будет произведено автоматически, когда метод receive() возвратит значение не вызвав никакой исключительной ситуации. В случае асинхронного получения сообщений, подтверждение получения будет произведено, когда метод onMessage() вернет значение.
119
* DUPS_OK_ACKNOWLEDGE - работа по подтверждению получения сообщения перекладывается на Session. Сообщения будут вновь доставлены в случае возникновения ошибки или "гибели" системы.
120 3 Александр Александров
* CLIENT_ACKNOWLEDGE - клиент должен вызвать метод acknowledge() интерфейса javax.jms.Message для того, чтобы явно подтвердить получение сообщения. При вызове данного метода будет подтверждено получение текущего и всех предыдущих полученных сообщений.
Go to top