2010-09-21 2 views
1

У меня есть уже существующий веб-сервис на основе SOAP, с помощью которого я хотел бы предоставить систему уведомлений с длинным опросом. Как я могу это реализовать? Клиент в настоящее время является богатым клиентом Java, который должен получать обновления от других подключенных клиентов. Сервер GlassFish 3.01. У меня был базовый, блокирующий @WebMethod, но у меня были проблемы, связанные с его использованием. Вот некоторые псевдо-код, показывающий идею веб-метода:Реализация длинного опроса с использованием SOAP-основанного @Stateless EJB, представленного как @WebService

@WebService(serviceName="mywebservice") 
@Stateless 
public class MyWebService { 
    @WebMethod 
    public String longPoll() { 
     short ct = 0; 
     while(someCondition == false && ct < 60) { 
      sleep(1000); // 1 sec 
      ct++; 
     } 
     if (someCondition) 
      return "got value"; 
     else 
      return ""; 
    } 
} 

А на стороне клиента, я называю это асинхронно, с помощью будущего объекта:

public Future<?> requestLongPollAsync(Date lastUpdate, 
      AsyncHandler<LongPollResponse> handler) { 
    try { 
     return mywebservice.longPollAsync(getXMLGregorianCalendar(lastUpdate), 
      handler); 
    } 
    // ... 
} 

Клиентская кажется работа хорошо. Тем не менее, у меня есть 2 проблемы, которые возникли из этого, казалось бы, из-за длительного характера вызова веб-службы:

  1. Каждый запрашивающий использует активный HTTP слушателя, так что это не является масштабируемым,
  2. Когда клиент отключается, GlassFish выдает исключение (исключение SSL, так как все вызовы должны проходить через защищенный SSL-прослушиватель (по умолчанию, http-listener-2)).

Нужно ли использовать com.sun.grizzly.comet.CometEngine? Описывает ли EJB 3.1 @Asynchronous аннотация что-то здесь? Все примеры, которые я нашел, основаны на API Servlet, AJAX и других технологиях, которые неприменимы. Спасибо.

ответ

0

Рассмотрите возможность использования асинхронной модели программирования JAX-WS 2.0 (и, скорее всего, клиент обратного вызова в вашем случае). Вот некоторые ресурсы:

+0

Pascal - спасибо за Ваш ответ. Я думаю, что клиентская сторона работает хорошо. Проблема, похоже, только на стороне сервера. Я редактировал свой вопрос, чтобы добавить информацию о вызовах на стороне клиента, которые я делаю в веб-службе. –