У меня есть ранее существующий веб-сервис на основе 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);
}
// ...
}
Кажется, что со стороны клиента все в порядке. Однако из-за этого у меня возникли две проблемы, по-видимому, из-за продолжительного характера вызова веб-службы:
- Каждый запросчик использует активный прослушиватель http, поэтому он не масштабируется,
- Когда клиент отключается, GlassFish выдает исключение (исключение SSL, поскольку все вызовы должны проходить через прослушиватель SSL (по умолчанию http-listener-2)).
Нужно ли использовать com.sun.grizzly.comet.CometEngine? EJB 3.1 @ Asynchronous аннотация делает что-нибудь здесь? Все примеры, которые я нашел, основаны на Servlet API, AJAX и других технологиях, которые не применимы. Спасибо.