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

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


Листинг 13.3. Класс-потребитель считывает сообщение из очереди с помощью классического API

>public class Consumer {

>··public static void main(String[] args) {

>····try {

>······// Получение контекста JNDI

>······Context jndiContext = new InitialContext();


>······// Выполняется поиск администрируемых объектов

>······ConnectionFactory connectionFactory = (ConnectionFactory) 

>························jndiContext.lookup("jms/javaee7/ConnectionFactory");

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


>······// Создаются необходимые для подключения к очереди артефакты

>······Connection connection = connectionFactory.createConnection();

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

>······MessageConsumer consumer = session.createConsumer(queue);

>······connection.start();


>······// Выполняется цикл получения сообщений

>······while (true) {

>········TextMessage message = (TextMessage) consumer.receive();

>········System.out.println("Сообщение получено: " + message.getText());

>······}

>····}··catch (NamingException | JMSException e) {

>······e.printStackTrace();

>····}

>··}

>}

Упрощенный API

Как видите, код, приведенный выше (см. листинги 13.2 и 13.3), довольно подробный и низкоуровневый. Вам нужно несколько артефактов, чтобы производить или потреблять сообщения (ConnectionFactory, Connection, Session…). Вдобавок вы должны обрабатывать исключение JMSException, которое является проверенным исключением (JMSException имеет несколько подклассов). Этот API был создан в JMS 1.1 в 2002 году и не изменялся до версии JMS 2.0.

JMS 2.0 вводит новый, упрощенный API, который состоит в основном из трех новых интерфейсов (JMSContext, JMSProducer и JMSConsumer). Они основаны на ConnectionFactory и других классических API, но не пользуются шаблонным кодом. Благодаря новому исключению JMSRuntimeException, которое является непроверенным, код отправления и получения сообщений стало гораздо проще писать и читать (взгляните на код следующих примеров).

На рис. 13.9 показана упрощенная диаграмма классов этого нового API. Обратите внимание, что устаревший, классический и упрощенный API находятся в пакете javax.jms.


Рис. 13.9. Упрощенный JMS API


Упрощенный API предоставляет ту же функциональность для обмена сообщениями, что и классический, но требует использования меньшего количества интерфейсов и в целом проще в использовании. Его основные интерфейсы:

• JMSContext — активное подключение к поставщику JMS и однопоточный контекст для отправки и получения сообщений;

• JMSProducer — объект, созданный JMSContext, который используется для отправки сообщений в очередь или тему;

• JMSConsumer — объект, созданный JMSContext, который применяется для приема сообщений, отправленных в очередь или тему.

JMSContext

JMSContext — это основной интерфейс упрощенного JMS API, введенный в JMS 2.0. Он сочетает в себе функциональность двух отдельных объектов классического API JMS 1.1: Connection (физическое соединение с поставщиком JMS) и Session (однопоточный контекст для отправки и получения сообщений).

JMSContext может быть создан приложением путем вызова одного из нескольких методов CreateContext фабрики соединений ConnectionFactory (см. листинг 13.1), а затем закрыт (то есть управляется приложением). Кроме того, если приложение работает в контейнере (EJB или Web), JMSContext может быть внедрен с помощью аннотации @Inject (управляется контейнером).

Когда приложению необходимо отправить сообщение, оно использует метод createProducer для создания JMSProducer, который предоставляет методы настройки и отправления сообщения. Сообщения могут быть отправлены либо синхронно, либо асинхронно. Для приема сообщений приложение может использовать один из нескольких методов createConsumer для создания объекта типа JMSConsumer. В табл. 13.4 приведено подмножество API JMSContext.


Таблица 13.4. Подмножество API JMSContext
СвойствоОписание
void start()Начинает (или повторяет) отправку приходящих сообщений
void stop()Временно приостанавливает доставку приходящих сообщений
void close()Закрывает JMSContext
void commit()Фиксирует все сообщения, отправляемые как транзакции, и высвобождает все блокировки
void rollback()Откатывает все сообщения, отправляемые как транзакции, и высвобождает все блокировки
ByteMessage createByteMessage()Создает объект типа ByteMessage
MapMessage create MapMessage()Создает объект типа MapMessage
Message createMessage()Создает объект типа Message
ObjectMessage create ObjectMessage()Создает объект типа ObjectMessage
StreamMessage createStreamMessage()Создает объект типа StreamMessage
TextMessage createTextMessage()Создает объект типа TextMessage
TopicMessage createTopic(String topicName)Создает объект типа Topic
Queue createQueue(String queueName)Создает объект типа Queue
JMSConsumer createConsumer(Destination destination)Создает объект типа JMSConsumer для указанного места назначения
JMSConsumer createConsumer(Destination destination, String messageSelector)Создает объект типа JMSConsumer для указанного места назначения с использованием селектора сообщений
JMSProducer createProducer()

Рекомендуем почитать
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 так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.