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