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

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

Пример traffic

Пример traffic демонстрирует, как реализовать и использовать простой адаптер входящих ресурсов, который получает данные из EIS с использованием сокета TCP.

Пример находится в каталоге tut-install/examples/connectors/traffic . См. главу 2 «Использование учебных примеров», для получения базовой информации о создании и запуске примеров приложений.

Пример демонстрирует сценарий на рисунке 56-3 и состоит из следующих модулей:

  • traffic-eis: программа Java SE, которая имитирует EIS

  • traffic-rar: реализация адаптера входящих ресурсов

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

  • traffic-war: веб-приложение, отображающее информацию из бина, управляемого сообщениями

  • traffic-ear: корпоративный архив, содержащий адаптер ресурса, компонент, управляемый сообщениями, и веб-приложение.

Рисунок 56-3. Пример traffic

На этом рисунке показаны компоненты примера traffic: WAR, взаимодействующий с EJB-компонентом, использующий тему JMS, и RAR, взаимодействующий с EIS через сокет TCP.

Модуль traffic-eis — это вспомогательный проект, имитирующий информационную систему управления трафиком. Он содержит программу Java SE, которая отправляет обновления статуса трафика для нескольких городов любому подписанному клиенту. Программа отправляет обновления в формате JSON через TCP-сокет. Например, обновление трафика выглядит так:

{"report":[
    {"city":"City1", "access":"AccessA", "status":"GOOD"},
    {"city":"City1", "access":"AccessB", "status":"CONGESTED"},
    ...
    {"city":"City5", "access":"AccessE", "status":"SLOW"}
 ]}

Модуль traffic-rar реализует входящий контракт архитектуры коннекторов Java EE. Этот модуль подписывается на систему информации о трафике, используя порт TCP, указанный в конфигурации, предоставленной MDB, и вызывает методы MDB для обработки обновлений информации о трафике.

Модуль traffic-ejb содержит управляемый сообщениями компонент, который активирует адаптер ресурсов с параметром конфигурации (порт TCP для подписки на систему информации о трафике). MDB содержит метод для обработки обновлений информации о трафике. Этот метод фильтрует обновления для определённого города и публикует результаты в разделе сервиса сообщений Java (JMS).

Модуль traffic-war содержит управляемый сообщениями компонент, который асинхронно получает отфильтрованные обновления информации о трафике из раздела JMS и отправляет их клиентам с помощью конечной точки веб-сокета.

Использование входящего адаптера ресурсов

В большинстве случаев разработчики приложений Java EE используют адаптеры входящих ресурсов, разработанные третьей стороной. Чтобы использовать адаптер входящих ресурсов, приложение Java EE включает компонент, управляемый сообщениями, со следующими характеристиками.

  • MDB реализует бизнес-интерфейс, определённый адаптером ресурсов.

  • MDB указывает параметры конфигурации для активации адаптера ресурса.

Бизнес-интерфейс, определённый адаптером ресурсов, не указан в архитектуре коннекторов Java EE. Это специфично для EIS.

MDB в этом примере определяется следующим образом:

@MessageDriven(
    activationConfig = {
      @ActivationConfigProperty(propertyName = "port",
                                propertyValue = "4008")
    }
)
public class TrafficMdb implements TrafficListener { ... }

Интерфейс TrafficListener определён в пакете API адаптера ресурсов. Адаптеру ресурсов требуется, чтобы MDB предоставил свойство port.

Когда MDB развёрнут, он активирует адаптер ресурсов traffic-rar, который вызывает методы MDB для обработки обновлений информации о трафике. Затем MDB фильтрует обновления для определённого города и публикует результаты в теме JMS.

В этом конкретном примере интерфейс TrafficListener пуст. В дополнение к этому интерфейсу адаптер ресурсов предоставляет аннотацию @TrafficCommand и использует reflection, чтобы выяснить, какие методы в MDB ею аннотированы:

@MessageDriven(...)
public class TrafficMdb implements TrafficListener {

    @TrafficCommand(name="report", info="Process report")
    public void processReport(String jsonReport) { ... }
    ...
}

Этот подход позволяет адаптировать MDB для поддержки новых функций в EIS без необходимости изменять интерфейс TrafficListener или модуль адаптера ресурсов.

Реализация адаптера входящих ресурсов

Модуль traffic-rar реализует контракт адаптера входящих ресурсов из архитектуры коннекторов Java EE для EIS, используемой в этом примере. Архитектура адаптера входящих ресурсов показана на рис. 56-4.

Рисунок 56-4. Архитектура примера traffic

На этом рисунке показаны классы в каждом из компонентов примера трафика.

Модуль traffic-rar реализует интерфейсы, перечисленные в таблице 56-3.

Таблица 56-3 Интерфейсы, реализованные в модуле traffic-rar

Пакет

Интерфейс

Описание

javax.resource.spi

ResourceAdapter

Определяет методы жизненного цикла адаптера ресурса.

javax.resource.spi

ActivationSpec

Определяет параметры конфигурации, которые MDB предоставляет для активации адаптера входящих ресурсов.

javax.resource.spi

Work

Подписчик сервиса трафика реализует этот интерфейс из контракта управления работами, чтобы ожидать обновления трафика в отдельном потоке.

Когда MDB активирует адаптер входящих ресурсов, контейнер вызывает метод endpointActivation класса TrafficResourceAdapter:

@Connector(...)
public class TrafficResourceAdapter implements ResourceAdapter, Serializable {
    ...
    @Override
    public void endpointActivation(MessageEndpointFactory endpointFactory,
                                   ActivationSpec spec)
                                   throws ResourceException {
        Class endpointClass = endpointFactory.getEndpointClass();
        /* этот метод в этом примере вызывается в новом потоке (thread):
        MessageEndpoint endpoint = endpointFactory.createEndpoint(null); */
    }
}

Метод getEndpointClass возвращает Class типа MDB, выполняющего активацию, что позволяет адаптеру ресурсов использовать reflection для поиска методов, аннотированных @TrafficCommand в MDB.

Метод createEndpoint возвращает объект MDB. Адаптер ресурсов использует этот объект для вызова методов MDB, когда он получает запросы от EIS.

После получения объекта конечной точки сообщения (MDB) адаптер ресурсов использует контракт управления работами для создания потока подписчика сервиса трафика, который получает обновления трафика от EIS. Адаптер ресурса получает объект WorkManager из контекста начальной загрузки следующим образом:

WorkManager workManager;
...
@Override
public void start(BootstrapContext ctx) ... {
    workManager = ctx.getWorkManager();
}

Адаптер ресурса планирует поток подписчика сервиса трафика с помощью менеджера работ:

tSubscriber = new TrafficServiceSubscriber(tSpec, endpoint);
workManager.scheduleWork(tSubscriber);

Класс TrafficServiceSubscriber реализует интерфейс javax.resource.spi.Work из контракта управления работами.

Поток подписчика сервиса трафика использует reflection для вызова методов в MDB:

private String callMdb(MessageEndpoint mdb, Method command,
                       String... params) ... {
    String resp;
    /* этот код содержит корректную обработку исключений */
    mdb.beforeDelivery(command);
    Object ret = command.invoke(mdb, (Object[]) params);
    resp = (String) ret;
    mdb.afterDelivery();
    return resp;
}

Подробнее см. в коде и комментариях модуля traffic-rar.

Выполнение примера трафика

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

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

Запуск traffic с IDE NetBeans

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

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

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

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

  5. Нажмите Открыть проект.

  6. На вкладке «Проекты» разверните узел traffic.

  7. Кликните правой кнопкой мыши модуль traffic-eis и выберите Открыть проект.

  8. Кликните правой кнопкой мыши проект traffic-eis и выберите «Выполнить».

    Сообщения от EIS появляются на вкладке Вывод:

    Traffic EIS accepting connections on port 4008
  9. На вкладке «Проекты» кликните правой кнопкой мыши проект traffic и выберите команду "Очистить и собрать".

    Эта команда собирает и упаковывает адаптер ресурсов, MDB и веб-приложение в архив EAR и развёртывает его. Журнал сервера показывает последовательность вызовов, которая активирует адаптер ресурсов, и обновления отфильтрованного трафика для City1.

  10. Откройте следующий URL в веб-браузере:

    http://localhost:8080/traffic/

    Веб-интерфейс показывает отфильтрованные обновления трафика для City1 каждые несколько секунд.

  11. После удаления приложения traffic-ear закройте приложение traffic-eis из строки состояния.

Запуск traffic с использованием Maven

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

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

    tut-install/examples/connectors/traffic/traffic-eis/
  3. Введите следующую команду в окне терминала:

    mvn install

    Эта команда собирает и упаковывает EIS трафика.

  4. Введите следующую команду в окне терминала:

    mvn exec:java

    Сообщения от EIS появляются в окне терминала:

    Traffic EIS accepting connections on port 4008

    Оставьте это окно терминала открытым.

  5. Откройте новое окно терминала и перейдите по ссылке:

    tut-install/examples/connectors/traffic/
  6. Введите следующую команду:

    mvn install

    Эта команда собирает и упаковывает адаптер ресурсов, MDB и веб-приложение в архив EAR и развёртывает его. Журнал сервера показывает последовательность вызовов, которая активирует адаптер ресурсов, и обновления отфильтрованного трафика для City1.

  7. Откройте следующий URL в веб-браузере:

    http://localhost:8080/traffic/

    Веб-интерфейс показывает отфильтрованные обновления трафика для City1 каждые несколько секунд.

  8. После удаления приложения traffic-ear нажмите Ctrl+C в первом окне терминала, чтобы закрыть приложение traffic-eis.


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