Impulsión del servidor Java Servlet 3.0: envío de datos varias veces utilizando el mismo AsyncContext
Dirigido por varios ejemplos y preguntas respondidas aquí (principalmentehttp://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html?page=3 ), Quiero que el servidor envíe la respuesta varias veces a un cliente sin completar la solicitud. Cuando la solicitud se agota, creo otra y así sucesivamente.
Quiero evitar el sondeo largo, ya que tengo que volver a crear la solicitud cada vez que recibo la respuesta. (y eso no es lo que apuntan las capacidades asíncronas del servlet 3.0).
Tengo esto en el lado del 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);
}
}
Y un hilo para escribir en contexto así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();
}
}
}
Pero cuando hago la solicitud, los datos se envían solo si llamoac.complete()
. Sin ella la solicitud siempre se agotará. Básicamente, quiero que los datos sean "transmitidos" antes de que se complete la solicitud.
Sólo para hacer una nota, he intentado esto conJetty 8
ContinuaciónAPI
, También he intentado con la impresión aOutputStream
en lugar dePrintWriter
. Yo tambien lo intentéflushBuffer()
en respuesta La misma cosa.
¿Qué estoy haciendo mal?
El lado del cliente se hace así:
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);
¿Alguien puede al menos confirmar que el lado del servidor está bien? :)