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? :)

questionAnswers(2)

yourAnswerToTheQuestion