Java Servlet 3.0-Server-Push: Daten werden mit demselben AsyncContext mehrmals gesendet
Angeführt von mehreren Beispielen und hier beantworteten Fragen (hauptsächlichhttp://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html?page=3 Ich möchte, dass der Server die Antwort mehrmals an einen Client sendet, ohne die Anforderung abzuschließen. Wenn die Anfrage abgelaufen ist, erstelle ich eine neue und so weiter.
Ich möchte lange Abfragen vermeiden, da ich die Anforderung jedes Mal neu erstellen muss, wenn ich die Antwort erhalte. (Und genau das ist nicht das, was die asynchronen Funktionen von Servlet 3.0 anstreben).
Ich habe dies auf der Serverseite:
@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);
}
}
Und ein Thread, um in den asynchronen Kontext zu schreiben.
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();
}
}
}
Aber wenn ich die Anfrage mache, werden Daten nur gesendet, wenn ich anrufeac.complete()
. Ohne es wird immer eine Zeitüberschreitung angefordert. Grundsätzlich möchte ich, dass Daten "gestreamt" werden, bevor die Anforderung abgeschlossen ist.
Nur um eine Notiz zu machen, ich habe es mit versuchtJetty 8
FortsetzungAPI
Habe ich auch versucht mit zu druckenOutputStream
anstattPrintWriter
. Ich habe es auch versuchtflushBuffer()
auf Antwort. Gleiche Sache.
Was mache ich falsch?
Die Client-Seite sieht folgendermaßen aus:
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);
Kann jemand zumindest bestätigen, dass die Serverseite in Ordnung ist? :)