Подтвердить что ты не робот

Какова цель сеанса JMS?

Какова цель сеанса JMS? Почему для обмена сообщениями JMS между отправителями и приемниками недостаточно одного соединения?

4b9b3361

Ответ 1

См. java.sun.com

Объект 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