Какова цель сеанса JMS? Почему для обмена сообщениями JMS между отправителями и приемниками недостаточно одного соединения?
Какова цель сеанса JMS?
Ответ 1
Объект Session - это однопоточный контекст для создания и потребления сообщений. Хотя он может выделять ресурсы поставщика за пределами виртуальной машины Java (JVM), он считается легким JMS-объектом.
Сеанс выполняет несколько целей:
- Это factory для производителей и потребителей сообщений.
- Он поставляет оптимизированные для поставщика серверы сообщений.
- Он поддерживает единую серию транзакций, которые объединяют работу, охватывающую своих производителей и потребителей в атомные единицы.
- Он определяет порядковый номер для сообщений, которые он потребляет, и сообщения, которые он создает.
- Он сохраняет сообщения, которые он потребляет, пока они не были подтверждены.
- Он сериализует выполнение прослушивателей сообщений, зарегистрированных с его пользователями сообщений.
Сессия может создавать и обслуживать нескольких производителей и потребителей сообщений.
Одно из типичных применений - иметь блок потока на синхронном MessageConsumer до тех пор, пока сообщение не поступит. Затем поток может использовать один или несколько сеансовых MessageProducer.
Ответ 2
Документация Oracle говорит:
Сессия может быть определена как транзакция. Каждый транзакционный сеанс поддерживает одну серию транзакций. Каждая транзакция группирует набор сообщений и набор сообщений получает в атомную единицу работы. По сути, транзакции организуют поток сообщений ввода сеанса и вывод потока сообщений в ряд атомных единиц. Когда транзакция совершается, ее атомная единица ввода подтверждается и отправляется связанная с ней атомная единица вывода. Если выполняется откат транзакции, отправленные транзакции сообщения уничтожаются, и ввод сеанса автоматически восстанавливается.
Содержимое блоков ввода и вывода транзакций - это просто те сообщения, которые были созданы и использованы в текущей транзакции сеанса.
Сделка завершается с использованием либо ее метода сеанса
commit
, либо его сеансаrollback
. Завершение текущей транзакции сеанса автоматически начинается следующим образом. В результате транзакционный сеанс всегда имеет текущую транзакцию, в которой выполняется ее работа.Служба транзакций Java (JTS) или какой-либо другой монитор транзакций может использоваться для объединения транзакции сеанса с транзакциями на другие ресурсы (базы данных, другие сеансы JMS и т.д.). Поскольку распределенные транзакции Java контролируются с помощью Java Transaction API (JTA), использование методов сеанса
commit
иrollback
в этом контексте запрещено.
Ответ 3
У меня был тот же вопрос и что привело меня сюда. Цитата Doc не очень полезна в этом случае, так как я уверен, что вопрос OP заключается не в том, как использовать сеансы, а в том, что они делают, но почему они действительно существуют, почему бы не объединить их возможности с Connection. ИМХО, это мета-вопрос.
Беспощадно Сессии - это, по сути, вид потока в Connection. Вот что спецификация JMS должна сказать о связи между потоком и сеансом при доступе к более позднему.
Нет ограничений на количество потоков, которые могут использовать сеанс или любые созданные им объекты. Ограничение состоит в том, что ресурсы сеанса не должны использоваться одновременно несколькими потоками. Пользователь должен убедиться, что это ограничение concurrency выполнено. Самый простой способ сделать это - использовать один поток. В случае асинхронной доставки используйте один поток для настройки в режиме остановки и затем запускайте асинхронную доставку. В более сложных случаях пользователь должен предоставить явную синхронизацию.
С точки зрения обмена сообщениями они содержат логическую единицу работы. Вот почему транзакции также связаны с сеансами.
Сказав это, довольно часто будет сопоставление 1:1 между соединением и сеансом. Вот почему я думаю, что JMSContext появился в версии 2.0. для упрощения вещей.
Глядя на дату поста OP, я думаю, что я почти на десять лет опаздываю.: D