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

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

Асинхронный приём сообщений с использованием бина, управляемого сообщениями

Если вы пишете приложение для запуска в контейнере Java EE или в платформе Java SE и хотите получать сообщения асинхронно, вам нужно определить класс, который реализует интерфейс MessageListener, создав JMSConsumer и вызвав метод setMessageListener.

Если вы пишете приложение для запуска в веб-контейнере Java EE или контейнере EJB и хотите, чтобы оно получало сообщения асинхронно, вам также необходимо определить класс, который реализует интерфейс MessageListener. Однако вместо того, чтобы создавать JMSConsumer и вызывать метод setMessageListener, вы должны сконфигурировать свой класс приёмника сообщений для бина, управляемого сообщениями. Об остальном позаботится сервер приложений.

Управляемые сообщениями бины могут реализовывать любую технологию обмена сообщениями. Однако чаще всего они реализуют технологию Java Message Service (JMS).

В этом разделе описывается простой пример компонента, управляемого сообщениями. Прежде чем продолжить, вы должны ознакомиться с общими понятиями в разделах Что такое бин, управляемый сообщениями? и Использование управляемых сообщениями бинов для асинхронного получения сообщений.

Обзор примера simplemessage

Приложение simplemessage состоит из следующих компонентов:

  • SimpleMessageClient: клиентское приложение, которое отправляет несколько сообщений в очередь

  • SimpleMessageBean: управляемый сообщениями компонент, который асинхронно обрабатывает сообщения, отправленные в очередь

Рисунок 49-3 иллюстрирует структуру этого приложения. Клиентское приложение отправляет сообщения в очередь, которая была создана административно с помощью Консоли администрирования. Провайдер JMS (в данном случае GlassFish Server) доставляет сообщения объектам управляемого сообщениями компонента, который затем обрабатывает сообщения.

Рис. 49-3. Приложение simplemessage

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

Исходный код для этого приложения находится в каталоге tut-install/examples/jms/simplemessage/.

Клиент simplemessage

SimpleMessageClient отправляет сообщения в очередь, которую слушает SimpleMessageBean. В первую очередь клиент инъецирует фабрику соединений и ресурс очереди:

@Resource(lookup = "java:comp/DefaultJMSConnectionFactory")
private static ConnectionFactory connectionFactory;

@Resource(lookup = "jms/MyQueue")
private static Queue queue;

Затем клиент создаёт JMSContext в блоке try -with-resources:

String text;
final int NUM_MSGS = 3;

try (JMSContext context = connectionFactory.createContext();) {

Наконец, клиент отправляет несколько текстовых сообщений в очередь:

for (int i = 0; i < NUM_MSGS; i++) {
    text = "This is message " + (i + 1);
    System.out.println("Sending message: " + text);
    context.createProducer().send(queue, text);
}

Класс бина, управляемого сообщениями в simplemessage

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

Первые несколько строк класса SimpleMessageBean используют атрибут activationConfig аннотации @MessageDriven для указания свойств конфигурации:

@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationLookup",
            propertyValue = "jms/MyQueue"),
    @ActivationConfigProperty(propertyName = "destinationType",
            propertyValue = "javax.jms.Queue")
})

Смотрите таблицу 48-3 для списка доступных свойств.

См. Отправка сообщений из сессионного компонента в MDB для примера свойств subscriptionDurability, clientId, subscriptionName и messageSelector.

Метод onMessage

Когда очередь получает сообщение, контейнер EJB вызывает метод или методы слушателя сообщений. Для компонента, использующего JMS, это метод onMessage интерфейса MessageListener.

В классе SimpleMessageBean метод onMessage преобразует входящее сообщение в TextMessage и отображает текст:

public void onMessage(Message inMessage) {

    try {
        if (inMessage instanceof TextMessage) {
            logger.log(Level.INFO,
                    "MESSAGE BEAN: Message received: {0}",
                    inMessage.getBody(String.class));
        } else {
            logger.log(Level.WARNING,
                    "Message of wrong type: {0}",
                    inMessage.getClass().getName());
        }
    } catch (JMSException e) {
        logger.log(Level.SEVERE,
                "SimpleMessageBean.onMessage: JMSException: {0}",
                e.toString());
        mdc.setRollbackOnly();
    }
}

Запуск simplemessage

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

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

Создание ресурсов для simplemessage

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

Если вы запускали простые примеры JMS в Простых приложениях JMS и не удалили ресурсы, у вас уже есть очередь. В противном случае следуйте инструкциям в Создание ресурсов для простых примеров для её создания.

Для получения дополнительной информации о создании ресурсов JMS см. Административное создание объектов JMS.

Запуск simplemessage в IDE NetBeans

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

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

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

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

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

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

    Эта команда упаковывает клиентское приложение и управляемый сообщениями компонент, затем создаёт файл simplemessage.ear в каталоге simplemessage-ear/target/. Затем она развёртывает модуль simplemessage-ear, извлекает клиентские заглушки и запускает клиентское приложение.

    Вывод в окне вывода выглядит следующим образом (ему предшествует вывод контейнера клиентского приложения):

    Sending message: This is message 1
    Sending message: This is message 2
    Sending message: This is message 3
    To see if the bean received the messages,
     check <install_dir>/domains/domain1/logs/server.log.

    В файле журнала сервера появляются строки, подобные следующим:

    MESSAGE BEAN: Message received: This is message 1
    MESSAGE BEAN: Message received: This is message 2
    MESSAGE BEAN: Message received: This is message 3

    Полученные сообщения могут появляться не в том порядке, в котором они были отправлены.

  7. После завершения работы приложения удалите его на вкладке «Сервисы».

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

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

  2. В окне терминала перейдите в:

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

    mvn install

    Эта команда упаковывает клиентское приложение и управляемый сообщениями компонент, а затем создаёт файл simplemessage.ear в каталоге simplemessage-ear/target/. Затем она развёртывает модуль simplemessage-ear, извлекает клиентские заглушки и запускает клиентское приложение.

    Вывод в окне терминала выглядит следующим образом (ему предшествует вывод контейнера клиентского приложения):

    Sending message: This is message 1
    Sending message: This is message 2
    Sending message: This is message 3
    To see if the bean received the messages,
     check <install_dir>/domains/domain1/logs/server.log.

    В файле журнала сервера появляются строки, подобные следующим:

    MESSAGE BEAN: Message received: This is message 1
    MESSAGE BEAN: Message received: This is message 2
    MESSAGE BEAN: Message received: This is message 3

    Полученные сообщения могут появляться не в том порядке, в котором они были отправлены.

  4. После того, как вы закончили запуск приложения, удалите его командой mvn cargo:undeploy.


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