Push сервера Java Servlet 3.0: отправка данных несколько раз с использованием одного и того же AsyncContext
Приведите несколько примеров и ответы на вопросы здесь (в основномhttp://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html?page=3 ), Я хочу, чтобы сервер отправлял ответ несколько раз клиенту без завершения запроса. Когда время ожидания истекло, я создаю еще один и так далее.
Я хочу избежать длительного опроса, так как мне приходится пересоздавать запрос каждый раз, когда я получаю ответ. (и это совсем нек чему стремятся асинхронные возможности сервлета 3.0).
У меня есть это на стороне сервера:
@WebServlet(urlPatterns = {"/home"}, name = "async", asyncSupported = true)
public class CometServlet extends HttpServlet {
public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException {
AsyncContext ac = request.startAsync(request, response);
HashMap store = AppContext.getInstance().getStore();
store.put(request.getParameter("id"), ac);
}
}
И поток для записи в асинхронный контекст.
class MyThread extends Thread {
String id, message;
public MyThread(String id, String message) {
this.id = id;
this.message = message;
}
public void run() {
HashMap store = AppContext.getInstance().getStore();
AsyncContext ac = store.get(id);
try {
ac.getResponse().getWriter().print(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Но когда я делаю запрос, данные отправляются только если я позвонюac.complete()
, Без этого запрос всегда будет тайм-аут. Так что в основном я хочу иметь данныепотоковым» до завершения запроса.
Просто чтобы сделать заметку, я попробовал это сJetty 8
продолжениеAPI
Я тоже пробовал с печатьюOutputStream
вместоPrintWriter
, Я тоже пробовалflushBuffer()
на ответ. То же самое.
Что я делаю неправильно?
Клиентская сторона делается так:
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:8080/home', true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 3 || xhr.readyState == 4) {
document.getElementById("dynamicContent").innerHTML = xhr.responseText;
}
}
xhr.send(null);
Может кто-нибудь хотя бы подтвердить, что на стороне сервера все в порядке? :)