Толчок сервера Java EE 6 - PullRequest
       40

Толчок сервера Java EE 6

2 голосов
/ 22 ноября 2011

Справочная информация

Я хорошо разбираюсь в создании центральной системы бронирования для различных поставщиков услуг.Он строится на Java EE 6 на GlassFish 3.1.1 с использованием JSF 2, EJB 3.1 и других стандартов JEE6.У каждого поставщика услуг есть своя собственная служба бронирования встреч, работающая на своем собственном сервере, подключенном к Интернету, но в настоящее время у них нет интерфейса, позволяющего своим пациентам назначать встречи самостоятельно.

Моя система будет работать синхроннозаписывать встречи в системах поставщиков услуг (в ответ на запросы пользователей) через определенный мной API, который включает потоковую передачу XML по HTTP.Эти запросы на бронирование встреч являются синхронными, потому что поставщики услуг будут продолжать записывать встречи непосредственно в своей системе старомодным способом (по телефону / счетчику) и по каким-либо причинам их система оставляет за собой право отклонять такие запросы (для предотвращения двойного бронирования ипо другим причинам).Таким образом, их системы сохраняют статус источника правды.

По очевидным причинам (главным образом, в области безопасности) соединения API устанавливаются системами поставщиков услуг.Это означает, что запросы отправляются сервером (моей системой), а ответы - клиентом (их системой).

Проблема

Мне нужны некоторые предложения относительно того, как я могу создать серверный push-XMLчерез HTTP API с использованием Java EE 6 на GlassFish 3.1.1.На ум приходит множество не идеальных вариантов.Один из них включает в себя одноэлементный компонент, содержащий карту идентификаторов моих встреч с их ответами на бронирование.В этом сценарии моя система опрашивает карту в течение ограниченного времени (например, до 10 секунд), пока не находит соответствующий ответ, а затем возвращает ответ, который затем обрабатывается в пользовательском интерфейсе JSF.Между тем сервлет API (или, возможно, веб-служба JAX-RS) опрашивает одноэлементный компонент для запросов, преобразует их в XML и передает их в выходной поток поставщика услуг.

Я уверен, что должно быть числоиз лучших способов сделать это, не включая потоковое соединение, блокировку, опрос и т. д.

Идеи?

Обновление

Я склонялся к Атмосфере / Джерси, нотеперь я понимаю, что блокировка ввода-вывода вполне масштабируема под NPTL, поэтому я гибок в этом отношении.

1 Ответ

1 голос
/ 30 ноября 2011

Вот как я это сделал:

Начните с одноэлементного EJB-компонента, содержащего:

  1. A Map<Long, BlockingDeque<OutboundApiMessage>>, где ключом является идентификатор клиента API;
  2. A Map<Long, Exchanger<AppointmentExchange>>, где ключом является идентификатор встречи на веб-стороне, а AppointmentExchange содержит этот идентификатор и идентификатор встречи на стороне клиента API.

Я установил управление параллельным управлением бином на одноэлементном EJB, определили некоторые методы для постановки в очередь, удаления из очереди и повторного запроса (последний в случае, если нажатие на сервер OutboundApiMessage не удалось и его нужно было добавить в начало очереди, где это будет следующий подлежащий удалению элемент), связал его сВеб-сервисы JAX-RS (один для восходящего потока, один для нисходящего потока).

В одноэлементном EJB есть метод синхронной записи встречи.Он ставит в очередь сообщение, которое должен получить клиент, создает Exchanger, содержащий новый экземпляр AppointmentExchange, затем блокирует ожидание обмена.Когда ответ возвращается на входящую веб-службу, эта веб-служба уведомляет одноэлементный EJB-компонент другим методом, который выполняет обмен через Exchanger.

. Теперь все работает довольно хорошо.Конечно, в этом есть нечто большее, но в этом суть.

...