SSE und Servlet 3.0

Ich habe eine typische SSE beim Laden der Seite registriert:

Klient:

sseTest: function(){

var source = new EventSource('mySSE');
source.onopen = function(event){
console.log("eventsource opened!");
};

source.onmessage = function(event){
var data = event.data;
console.log(data);
document.getElementById('sse').innerHTML+=event.data + "<br />";
};
}

Mein Javascript-Debugger sagt, dass "eventsource eröffnet!" war erfolgreich.

Mein Servercode ist ein Servlet 3.0:

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns={"/mySSE"}, name = "hello-sse", asyncSupported=true)
public class MyServletSSE extends HttpServlet {

@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

resp.setContentType("text/event-stream");
resp.setCharacterEncoding("UTF-8");

Random random = new Random();
PrintWriter out = resp.getWriter();

//AsyncContext aCtx = req.startAsync(req, resp);
//ServletRequest sReq = aCtx.getRequest();

String next = "data: " + String.valueOf(random.nextInt(100) + 1) + "\n\n";
//out.print("retry: 600000\n"); //set the timeout to 10 mins in milliseconds
out.write(next);
out.flush();
// do not close the stream as EventSource is listening
//out.close();
//super.doGet(req, resp);
}
}

Der Code funktioniert! Der Client-Code löst alle 3 Sekunden die doGet () - Methode aus und ruft die neuen Daten ab.

Fragen: Ich frage mich jedochwie ich diesen Code verbessern kann mit neuen Servlet 3.0 Futures wie Async-Support oder asyncContext.addListener (asyncListener) oder etwas anderem, was ich nicht kenne. Da ich den Strom nie schließe, frage ich michwie mein Server skaliert?

Theoretisch wäre der beste Ansatz, die doGet () - Methode über den serverseitigen Code explizit auszulösen, wenn neue Daten vorhanden sind, sodass der Client die clientseitige "onmessage ()" - Methode und damit die serverseitig "doGet ()" - Methode alle 3 Sekunden für neue Daten.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage