Изучаем Java EE 7 - [201]

Шрифт
Интервал

>}

Место назначения

Место назначения — это администрируемый объект, содержащий информацию о конфигурации конкретного поставщика, такую как адрес места назначения. Эта конфигурация скрыта от клиента JMS с помощью стандартного интерфейса javax.jms.Destination. Как и в случае с фабрикой соединений, для возврата таких объектов требуется выполнить поиск JNDI:

>Context ctx = new InitialContext();

>Destination queue = (Destination) ctx.lookup("jms/javaee7/Queue");

Соединение

Объект типа Javax.jms.Connection, который вы создаете, используя метод createConnection() фабрики соединений, инкапсулирует соединение с провайдером JMS. Подключения являются потокобезопасными и разработаны разделяемыми, поскольку открытие нового соединения требует значительного количества ресурсов. Тем не менее сеанс (javax.jms.Session) обеспечивает однопоточный контекст для отправки и получения сообщений, используя подключение для создания одного или нескольких сеансов. Если у вас есть фабрика соединений, вы можете использовать ее для создания соединения следующим образом:

>Connection connection = connectionFactory.createConnection();

Перед тем как адресат сможет получить сообщения, он должен вызвать метод start(). Если вам нужно временно остановить получение сообщений, закрывать соединение не требуется — вы можете вызвать метод stop():

>connection.start();

>connection.stop();

Когда приложение завершается, необходимо закрыть все созданные соединения. Закрытие соединения закрывает все его сеансы, а также производителей и потребителей:

>connection.close();

Сеанс

Вы создаете сеанс из соединения с использованием метода createSession(). Сеанс предоставляет транзакционный контекст, в котором набор сообщений, которые будут отправлены или получены, сгруппирован в атомарную единицу работы. Это означает, что, если вы отправите несколько сообщений в течение одного сеанса, JMS гарантирует, что все они будут отправлены либо не будет отправлено ни одного. Такое поведение устанавливается при создании сеанса:

>Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

Первый параметр метода определяет, будет ли сеанс поддерживать транзакции. В данном примере параметр имеет значение true, а это означает, что запрос на отправку сообщений не будет выполнен либо до вызова метода commit(), либо до закрытия сеанса. Если бы значение параметра было false, сеанс не был бы транзакционным — сообщения будут отправляться по вызову метода send(). Второй параметр означает, что сеанс автоматически подтверждает сообщения, если они были получены успешно. Сеанс имеет один поток и используется для создания сообщений, производителей и потребителей.

Сообщения

Для общения клиенты обмениваются сообщениями; производитель шлет сообщение к месту назначения, а потребитель получает его. Сообщения представляют собой объекты, которые инкапсулируют информацию и состоят из трех частей (рис. 13.8):

• заголовок — содержит стандартную информацию для идентификации и маршрутизации сообщений;

• свойства — пары «имя/значение», которые приложение может установить или считать; свойства также позволяют месту назначения фильтровать сообщения на основе их значений;

• тело — фактически содержит сообщение и может иметь один из нескольких форматов (текст, байты, объект и т. д.).

Заголовок

Заголовок имеет предопределенные пары «имя/значение», общие для всех сообщений, которые клиенты и поставщики используют для идентификации и маршрутизации сообщений. Они могут рассматриваться в качестве метаданных сообщения, поскольку дают информацию о нем. Каждое поле связано с геттером и сеттером, определенным в интерфейсе javax.jms.Message. Некоторые поля заголовка предусматривают задание значений клиентом, но многие из них устанавливаются автоматически с помощью методов send() и publish(). В табл. 13.2 описаны все поля заголовков сообщений JMS.


Рис. 13.8. Структура сообщения JMS


Таблица 13.2. Поля, содержащиеся в заголовке
ПолеОписаниеУстанавливается
JMSDestinationУказывает место назначения, по которому было отправлено сообщениеМетодами send() или publish()
JMSDeliveryModeJMS поддерживает два режима доставки сообщений. PERSISTENT указывает поставщику убедиться, что сообщение не потерялось при передаче из-за ошибки. NON_ PERSISTENT — это режим с наименьшими накладными расходами, поскольку требует хранить сообщение в постоянном хранилищеМетодами send() или publish()
JMSMessageIDПредоставляет значение, которое уникально идентифицирует каждое сообщение, отправленное поставщикомМетодами send() или publish()
JMSTimestampСодержит время, в которое сообщение поступило поставщикуМетодами send() или publish()
JMSCorrelationIDКлиент может использовать его, чтобы связать одно сообщение с другим, например связать ответное сообщение с сообщением-запросомКлиентом
JMSReplyToСодержит место назначения, по которому должно быть отправлено сообщение-ответКлиентом
JMSRedeliveredЭто двоичное значение устанавливается поставщиком чтобы указать, что сообщение должно быть доставлено повторноПоставщиком
JMSTypeЭто поле идентифицирует тип сообщенияКлиентом
JMSExpirationКогда сообщение отправляется, время его существования рассчитывается и устанавливается на основе указанного времени существования в методе send()

Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.