JMS » История » Версия 7
Александр Александров, 05.02.2020 17:28
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 | 4 | Александр Александров | |
27 | Данный набор определен в пакете javax.jms в дереве пакетов J2EE. JMS поддерживает две модели обмена сообщениями: point-to-point (точка - точка) и publish-subscribe (издатель-подписчик). |
||
28 | 2 | Александр Александров | |
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 | 5 | Александр Александров | h3. Назовите основные интерфейсы JMS, для чего они предназначены. |
53 | 1 | Александр Александров | |
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 | 6 | Александр Александров | h3. Какие стандартные типы сообщений определены JMS? |
76 | 1 | Александр Александров | |
77 | 7 | Александр Александров | В JMS определены следующие стандартные типы сообщений: |
78 | 2 | Александр Александров | |
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 для того, чтобы явно подтвердить получение сообщения. При вызове данного метода будет подтверждено получение текущего и всех предыдущих полученных сообщений. |