Изучаем 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.
Элемент | Описание |
---|---|
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 внедряются при инициализации.
>@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.
>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. Обмен сообщениями является асинхронным по своей сути, поэтому не существует временной зависимости между производителями и потребителями. Тем не менее сам клиент может получать сообщения двумя способами:
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.