Push serwera Java Servlet 3.0: wielokrotne wysyłanie danych przy użyciu tego samego AsyncContext
Prowadzi przez kilka przykładów i odpowiedzi na pytania tutaj (główniehttp://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html?page=3 ) Chcę, aby serwer wielokrotnie wysyłał odpowiedź do klienta bez wypełnienia żądania. Po przekroczeniu limitu czasu tworzę inny i tak dalej.
Chcę uniknąć długiego odpytywania, ponieważ muszę odtworzyć żądanie za każdym razem, gdy otrzymam odpowiedź. (i to nie jest to, do czego zmierzają możliwości asynchroniczne serwletu 3.0).
Mam to po stronie serwera:
@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);
}
}
I wątek do zapisu w kontekście asynchronicznym.
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();
}
}
}
Ale kiedy składam żądanie, dane są wysyłane tylko wtedy, gdy zadzwonięac.complete()
. Bez niego żądanie zawsze będzie wygasać. Zasadniczo chcę, aby dane były „przesyłane strumieniowo” przed zakończeniem żądania.
Aby zrobić notatkę, spróbowałem tegoJetty 8
KontynuacjaAPI
, Spróbowałem także drukować naOutputStream
zamiastPrintWriter
. Próbowałem teżflushBuffer()
w odpowiedzi. Ta sama rzecz.
Co ja robię źle?
Strona klienta wygląda następująco:
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);
Czy ktoś może przynajmniej potwierdzić, że strona serwera jest w porządku? :)