Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Отправка сообщений из сессионного компонента в MDB

В этом разделе объясняется, как написать, скомпилировать, упаковать, развернуть и запустить приложение, которое использует JMS API в сочетании с сессионным компонентом. Приложение содержит следующие компоненты:

  • Клиентское приложение, которое вызывает сессионный компонент

  • Сессионный компонент, который публикует несколько сообщений в теме

  • Компонент, управляемый сообщениями, который получает и обрабатывает сообщения, используя долговременную подписку на тему и селектор сообщений

Исходные файлы для этого раздела находятся в каталоге tut-install/examples/jms/clientsessionmdb/. Пути в этом разделе относятся к этому каталогу.

Здесь рассматриваются следующие темы:

Компоненты приложения clientsessionmdb

Это приложение демонстрирует, как отправлять сообщения из Enterprise-бина (в данном случае из сессионного компонента), а не из клиентского приложения, как в примере в Асинхронный приём сообщений с использованием бина, управляемого сообщениями. Рисунок 49-4 иллюстрирует структуру этого приложения. Отправка сообщений из Enterprise-бина очень похожа на отправку сообщений из Managed-бина, что было показано в Отправка и получение сообщений в простом веб-приложении.

Рис. 49.4. Приложение Enterprise Bean: клиент -> сессионный компонент -> управляемый сообщениями компонент

Диаграмма приложения, показывающая клиентское приложение, вызывающее сессионный компонент, который отправляет сообщения, обработанные управляемым сообщениями компонентом

В этом примере Enterprise-бин Publisher представляет собой эквивалент корпоративного приложения для новостной ленты сервиса, которая разбивает новостные события на шесть новостных категорий. Компонент, управляемый сообщениями, может представлять новостное отделение, где, например, спортивная колонка будет устанавливать подписку на все новостные события, относящиеся к спорту.

Клиентское приложение в этом примере инъецирует удалённый домашний интерфейс Enterprise-бина Publisher и затем вызывает бизнес-метод компонента. Enterprise-бин создаёт 18 текстовых сообщений. Для каждого сообщения он случайным образом устанавливает свойство String категории новостей в одно из шести значений, а затем публикует сообщение в теме. Компонент, управляемый сообщениями, использует селектор сообщений для ограничения количества опубликованных сообщений, которое будет ему доставлено.

Кодирование клиентского приложения: MyAppClient.java

Клиентское приложение MyAppClient.java, находящееся в clientsessionmdb-app-client, не выполняет операций JMS API и поэтому устроено проще, чем клиент в Асинхронном приёме сообщений с использованием бина, управляемого сообщениями. Клиент использует инъецирование зависимостей для получения бизнес-интерфейса Enterprise-бина Publisher:

@EJB(name="PublisherRemote")
private static PublisherRemote publisher;

Затем клиент дважды вызывает бизнес-метод компонента.

Кодирование сессионного компонента Publisher

Бин Publisher — это сессионный компонент без сохранения состояния, имеющий один бизнес-метод. Бин Publisher использует удалённый, а не локальный интерфейс, поскольку к нему обращается клиентское приложение.

Удалённый интерфейс PublisherRemote.java, расположенный в clientsessionmdb-ejb, объявляет один бизнес-метод publishNews.

Класс бинов PublisherBean.java, также находящийся в clientsessionmdb-ejb, реализует метод publishNews и его вспомогательный метод chooseType. Класс бина инъецирует ресурсы SessionContext и Topic (тема определена в бине, управляемом сообщениями). Затем он инъецирует JMSContext, который использует предустановленную фабрику соединений по умолчанию, если не указано иное. Класс бина начинается следующим образом:

@Stateless
@Remote({
    PublisherRemote.class
})
public class PublisherBean implements PublisherRemote {

    @Resource
    private SessionContext sc;
    @Resource(lookup = "java:module/jms/newsTopic")
    private Topic topic;
    @Inject
    private JMSContext context;
    ...

Бизнес-метод publishNews создаёт JMSProducer и публикует сообщения.

Кодирование бина, управляемого сообщениями: MessageBean.java

Класс управляемого сообщениями бина MessageBean.java, найденный в clientsessionmdb-ejb, практически идентичен классу в Асинхронном приёме сообщений с использованием бина, управляемого сообщениями. Однако аннотация @MessageDriven отличается, потому что вместо очереди компонент использует тему, долговременную подписку и селектор сообщений. Бин определяет тему для использования приложения. Определение использует область видимости java:module, поскольку и сессионный компонент, и управляемый сообщениями компонент находятся в одном и том же модуле. Поскольку назначение определяется в бине, управляемом сообщениями, аннотация @MessageDriven использует свойство конфигурации активации destinationLookup. (См. Создание ресурсов для приложений Java EE для получения дополнительной информации.) Аннотация также устанавливает свойства конфигурации активации messageSelector, subscriptionDurability, clientId и subscriptionName следующим образом:

@JMSDestinationDefinition(
        name = "java:module/jms/newsTopic",
        interfaceName = "javax.jms.Topic",
        destinationName = "PhysicalNewsTopic")
@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationLookup",
            propertyValue = "java:module/jms/newsTopic"),
    @ActivationConfigProperty(propertyName = "destinationType",
            propertyValue = "javax.jms.Topic"),
    @ActivationConfigProperty(propertyName = "messageSelector",
            propertyValue = "NewsType = 'Sports' OR NewsType = 'Opinion'"),
    @ActivationConfigProperty(propertyName = "subscriptionDurability",
            propertyValue = "Durable"),
    @ActivationConfigProperty(propertyName = "clientId",
            propertyValue = "MyID"),
    @ActivationConfigProperty(propertyName = "subscriptionName",
            propertyValue = "MySub")
})

Тема определена в PublisherBean. Селектор сообщений в этом случае представляет как спортивные, так и аналитические колонки для демонстрации синтаксиса селекторов сообщений.

Адаптер ресурсов JMS использует эти свойства для создания фабрики соединений для бина, управляемого сообщениями, который позволяет бину использовать долговременную подписку.

Запуск clientsessionmdb

Вы можете использовать IDE NetBeans или Maven для сборки, развёртывания и запуска примера simplemessage.

В этом примере используется тема, заданная аннотацией, и предустановленная фабрика соединений по умолчанию java:comp/DefaultJMSConnectionFactory, поэтому не требуется создавать ресурсы для неё.

Здесь рассматриваются следующие темы:

Запуск clientsessionmdb с IDE NetBeans

  1. Удостоверьтесь, чтобы GlassFish Server был запущен (см. Запуск и остановка сервера GlassFish).

  2. В меню «Файл» выберите «Открыть проект».

  3. В диалоговом окне «Открыть проект» перейдите к:

    tut-install/examples/jms/clientsessionmdb
  4. Выберите каталог clientsessionmdb.

  5. Убедитесь, что установлен флажок «Открыть требуемые проекты», затем нажмите «Открыть проект».

  6. На вкладке «Проекты» кликните правой кнопкой мыши проект clientsessionmdb и выберите «Сборка». (В среде IDE NetBeans требуется установить флажок для запуска предварительной сборки.)

    Эта команда создаёт следующее:

    • JAR-файл клиентского приложения, содержащий файл класса клиента и удалённый интерфейс сессионного компонента, а также файл манифеста, который задаёт основной класс и помещает файл EJB JAR в его classpath.

    • Файл EJB JAR, который содержит как сессионный компонент, так и управляемый сообщениями компонент

    • EAR-файл приложения, содержащий два файла JAR

      Файл clientsessionmdb.ear создаётся в каталоге clientsessionmdb-ear/target/.

      Затем команда развёртывает файл EAR, извлекает клиентские заглушки и запускает клиентское приложение.

      Клиент отображает эти строки:

      To view the bean output,
       check <install_dir>/domains/domain1/logs/server.log.

      Вывод Enterprise-бинов отображается в файле журнала сервера. Сессионный компонент Publisher отправляет два набора по 18 сообщений, пронумерованных с 0

  7. Из-за селектора сообщений бин, управляемый сообщениями, получает только те сообщения, у которых свойство NewsType имеет значение Sports или Opinion.

  8. Используйте вкладку «Сервисы» чтобы удалить приложения после завершения его работы.

Запуск clientsessionmdb с помощью Maven

  1. Удостоверьтесь, чтобы GlassFish Server был запущен (см. Запуск и остановка сервера GlassFish).

  2. Перейдите в следующий каталог:

    tut-install/examples/jms/clientsessionmdb/
  3. Чтобы скомпилировать исходные файлы и пакет, развернуть и запустить приложение, введите следующую команду:

    mvn install

    Эта команда создаёт следующее:

    • JAR-файл клиентского приложения, содержащий файл класса клиента и удалённый интерфейс сессионного компонента, а также файл манифеста, который задаёт основной класс и помещает файл EJB JAR в его classpath.

    • Файл EJB JAR, который содержит как сессионный компонент, так и управляемый сообщениями компонент

    • EAR-файл приложения, содержащий два файла JAR

      Файл clientsessionmdb.ear создаётся в каталоге clientsessionmdb-ear/target/.

      Затем команда развёртывает файл EAR, извлекает клиентские заглушки и запускает клиентское приложение.

      Клиент отображает эти строки:

      To view the bean output,
       check <install_dir>/domains/domain1/logs/server.log.

      Вывод Enterprise-бинов отображается в файле журнала сервера. Сессионный компонент Publisher отправляет два набора по 18 сообщений, пронумерованных с 0

  4. Из-за селектора сообщений бин, управляемый сообщениями, получает только те сообщения, у которых свойство NewsType имеет значение Sports или Opinion.

  5. Удалите приложение после того, как вы закончили его выполнение:

    mvn cargo:undeploy

Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)