{"report":[
{"city":"City1", "access":"AccessA", "status":"GOOD"},
{"city":"City1", "access":"AccessB", "status":"CONGESTED"},
...
{"city":"City5", "access":"AccessE", "status":"SLOW"}
]}
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
Назад | Вперёд | Содержание |
Пример traffic
демонстрирует, как реализовать и использовать простой адаптер входящих ресурсов, который получает данные из EIS с использованием сокета TCP.
Пример находится в каталоге tut-install/examples/connectors/traffic
. См. главу 2 «Использование учебных примеров», для получения базовой информации о создании и запуске примеров приложений.
Пример демонстрирует сценарий на рисунке 56-3 и состоит из следующих модулей:
traffic-eis
: программа Java SE, которая имитирует EIS
traffic-rar
: реализация адаптера входящих ресурсов
traffic-ejb
: управляемый сообщениями компонент, являющийся конечной точкой для входящих сообщений
traffic-war
: веб-приложение, отображающее информацию из бина, управляемого сообщениями
traffic-ear
: корпоративный архив, содержащий адаптер ресурса, компонент, управляемый сообщениями, и веб-приложение.
Модуль 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.
Модуль traffic-rar
реализует интерфейсы, перечисленные в таблице 56-3.
Таблица 56-3 Интерфейсы, реализованные в модуле traffic-rar
Пакет |
Интерфейс |
Описание |
|
|
Определяет методы жизненного цикла адаптера ресурса. |
|
|
Определяет параметры конфигурации, которые MDB предоставляет для активации адаптера входящих ресурсов. |
|
|
Подписчик сервиса трафика реализует этот интерфейс из контракта управления работами, чтобы ожидать обновления трафика в отдельном потоке. |
Когда 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
.
Здесь рассматриваются следующие темы:
Удостоверьтесь, чтобы GlassFish Server был запущен (см. Запуск и остановка сервера GlassFish).
В меню «Файл» выберите «Открыть проект».
В диалоговом окне «Открыть проект» перейдите к:
tut-install/examples/connectors
Выберите каталог traffic
.
Нажмите Открыть проект.
На вкладке «Проекты» разверните узел traffic
.
Кликните правой кнопкой мыши модуль traffic-eis
и выберите Открыть проект.
Кликните правой кнопкой мыши проект traffic-eis
и выберите «Выполнить».
Сообщения от EIS появляются на вкладке Вывод:
Traffic EIS accepting connections on port 4008
На вкладке «Проекты» кликните правой кнопкой мыши проект traffic
и выберите команду "Очистить и собрать".
Эта команда собирает и упаковывает адаптер ресурсов, MDB и веб-приложение в архив EAR и развёртывает его. Журнал сервера показывает последовательность вызовов, которая активирует адаптер ресурсов, и обновления отфильтрованного трафика для City1.
Откройте следующий URL в веб-браузере:
http://localhost:8080/traffic/
Веб-интерфейс показывает отфильтрованные обновления трафика для City1 каждые несколько секунд.
После удаления приложения traffic-ear
закройте приложение traffic-eis
из строки состояния.
Удостоверьтесь, чтобы GlassFish Server был запущен (см. Запуск и остановка сервера GlassFish).
В окне терминала перейдите в:
tut-install/examples/connectors/traffic/traffic-eis/
Введите следующую команду в окне терминала:
mvn install
Эта команда собирает и упаковывает EIS трафика.
Введите следующую команду в окне терминала:
mvn exec:java
Сообщения от EIS появляются в окне терминала:
Traffic EIS accepting connections on port 4008
Оставьте это окно терминала открытым.
Откройте новое окно терминала и перейдите по ссылке:
tut-install/examples/connectors/traffic/
Введите следующую команду:
mvn install
Эта команда собирает и упаковывает адаптер ресурсов, MDB и веб-приложение в архив EAR и развёртывает его. Журнал сервера показывает последовательность вызовов, которая активирует адаптер ресурсов, и обновления отфильтрованного трафика для City1.
Откройте следующий URL в веб-браузере:
http://localhost:8080/traffic/
Веб-интерфейс показывает отфильтрованные обновления трафика для City1 каждые несколько секунд.
После удаления приложения traffic-ear
нажмите Ctrl+C в первом окне терминала, чтобы закрыть приложение traffic-eis
.
Назад | Вперёд | Содержание |