Push do servidor Java Servlet 3.0: Enviando dados várias vezes usando o mesmo AsyncContext
Liderar por vários exemplos e perguntas respondidas aqui (principalmentehttp://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html?page=3 ), Desejo que o servidor envie a resposta várias vezes para um cliente sem concluir a solicitação. Quando o pedido expira, eu crio outro e assim por diante.
Eu quero evitar a pesquisa longa, pois tenho que recriar a solicitação toda vez que obtenho a resposta. (e isso não é o que os recursos assíncronos do servlet 3.0 estão visando).
Eu tenho isso no lado do servidor:
@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<String, AsyncContext> store = AppContext.getInstance().getStore();
store.put(request.getParameter("id"), ac);
}
}
E um thread para escrever no contexto assíncrono.
class MyThread extends Thread {
String id, message;
public MyThread(String id, String message) {
this.id = id;
this.message = message;
}
public void run() {
HashMap<String, AsyncContext> store = AppContext.getInstance().getStore();
AsyncContext ac = store.get(id);
try {
ac.getResponse().getWriter().print(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Mas quando eu faço o pedido, os dados são enviados apenas se eu ligarac.complete()
. Sem ele, o pedido sempre será tempo limite. Então, basicamente, eu quero ter dados "transmitidos" antes que a solicitação seja concluída.
Só para anotar, eu tentei isso comJetty 8
ContinuaçãoAPI
, Eu também tentei imprimir comOutputStream
ao invés dePrintWriter
. Eu também tenteiflushBuffer()
na resposta. Mesma coisa.
O que estou fazendo de errado?
O lado do cliente é feito assim:
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);
Alguém pode pelo menos confirmar que o lado do servidor está bem? :)