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

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

>······try (JMSContext context = connectionFactory.createContext()) {

>········context.createProducer(). send(queue, "Сообщение отправлено " + new Date());

>······}


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

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

>····}

>··}

>}

Если вы сравните данный код с тем, который использует классический API (см. листинг 13.2), вы заметите, что код стал менее подробным. Обработка исключений также стала аккуратнее, поскольку в новом API используется JMSRuntimeException, который является непроверенным исключением.

Производство сообщения внутри контейнера

Фабрики соединений и места назначения являются администрируемыми объектами, которые находятся в поставщике сообщений и должны быть объявлены в пространстве имен JNDI, поэтому вы используете JNDI API для их поиска. Когда код клиента выполняется внутри контейнера, вместо поиска может быть использовано внедрение зависимостей. Java EE 7 имеет несколько контейнеров: EJB, сервлет, и клиентский контейнер приложения (ACC). Если код работает в одном из этих контейнеров, аннотация @Resource может применяться для внедрения ссылки на этот ресурс в контейнере. С Java EE 7 использовать ресурсы намного проще, так как сложность ниже, чем у JNDI, а также не требуется настраивать ссылки на ресурсы в дескрипторах развертывания. Вы просто полагаетесь на возможности контейнера по внедрению.

В табл. 13.7 перечислены атрибуты, которые принадлежат к аннотации @Resource.


Таблица 13.7. API аннотации @javax.annotation.Resource
ЭлементОписание
nameИмя ресурса JNDI (зависит от реализации и не переносимо)
typeТип ресурса в Java (например, javax.sql.DataSource или javax.jms.Topic)
authenticationTypeТип аутентификации, используемый в ресурсе (как для контейнера, так и для приложения)
shareableОпределяет, является ли ресурс разделяемым
mappedNameХарактерное для продукта имя, которое ресурс должен преобразовывать
lookupИмя ресурса в JNDI, с которым будет связан определяемый ресурс. Оно может связывать любой совместимый ресурс с использованием имен JNDI
descriptionОписание ресурса

Для использования аннотации @Resource, возьмем производителя из приведенного выше примера (см. листинг 13.4), изменим его компонент на тот, который не сохраняет свое состояние, и используем внедрение вместо поиска JNDI. В том примере (см. листинг 13.4) для обеих фабрик соединений и очереди выполняется поиск JNDI. В листинге 13.5 имя JNDI находится в аннотации @Resource. Когда ProducerEJB работает в контейнере, ссылки на ConnectionFactory и Queue внедряются при инициализации.


Листинг 13.5. ProducerEJB, запущенный внутри контейнера и использующий аннотацию @Resource

>@Stateless

>public class ProducerEJB {

>··@Resource(lookup = "jms/javaee7/ConnectionFactory")

>··private ConnectionFactory connectionFactory;

>··@Resource(lookup = "jms/javaee7/Queue")

>··private Queue queue;


>··public void sendMessage() {


>····try (JMSContext··context = connectionFactory.createContext()) {

>······context.createProducer(). send(queue, "Сообщение отправлено " + new Date());

>····}

>··}

>}

Данный код проще, чем приведенный ранее (см. листинг 13.4), поскольку он не имеет дела с поиском JNDI или классом NamingException. Контейнер выполняет внедрение администрируемых объектов, как только инициализируется EJB.

Производство сообщений внутри контейнера с помощью CDI

Когда производитель выполняется в контейнере (EJB или контейнере сервлетов) с доступным CDI, он может внедрить JMSContext. Контейнер будет управлять его жизненным циклом (нет необходимости создавать или закрыть JMSContext). Это можно сделать благодаря аннотациям @Inject и @JMSConnectionFactory.

Аннотацию javax.jms.JMSConnectionFactory можно применить, чтобы указать имя ConnectionFactory для поиска JNDI, которое используется для создания JMSContext (листинг 13.6). Если аннотация JMSConnectionFactory опущена, по умолчанию задействуется стандартная фабрика соединений JMS.


Листинг 13.6. Управляемый компонент производит сообщение с помощью аннотации @Inject

>public class Producer {

>··@Inject

>··@JMSConnectionFactory("jms/javaee7/ConnectionFactory")

>··private··JMSContext context;

>··@Resource(lookup = "jms/javaee7/Queue")

>··private Queue queue;


>··public void sendMessage() {

>····context.createProducer(). send(queue, "Сообщение отправлено " + new Date());

>··}

>}

Данный код довольно минималистичен. Контейнер выполняет всю работу по внедрению необходимых компонентов и управлению их жизненным циклом. Как разработчику вам нужна только одна строка кода, чтобы отправить сообщение.

Аннотация javax.jms.JMSPasswordCredential также может быть использована, чтобы указать имя пользователя и пароль, когда создан JMSContext:

>@Inject

>@JMSConnectionFactory("jms/connectionFactory")

>@JMSPasswordCredential(userName="admin",password="mypassword")

>private JMSContext context;

Написание потребителей сообщений

Клиент использует JMSConsumer, чтобы получать сообщения из места назначения. JMSConsumer создается путем передачи объекта типа Queue или Topic в метод createConsumer() класса JMSContext. Обмен сообщениями является асинхронным по своей сути, поэтому не существует временной зависимости между производителями и потребителями. Тем не менее сам клиент может получать сообщения двумя способами:


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