Реализация длинного опроса с помощью @Stateless EJB на основе SOAP, представленного как @WebService - PullRequest
1 голос
/ 22 сентября 2010

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

@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 "";
    }
}

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

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

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

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

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

1 Ответ

0 голосов
/ 22 сентября 2010

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

...