Я зарегистрировал типичную SSE при загрузке страницы:SSE и Servlet 3.0
Клиент:
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 />";
};
}
Мой Javascript-Debugger говорит, что "! EventSource открыл" был успешно.
Мой код сервера является 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);
}
}
код работает! Клиент-код запускает метод doGet() каждые 3 секунды и извлекает новые данные.
Вопросы: Однако, интересно как я могу сделать этот код лучше с помощью новой Servlet 3.0, такие как фьючерсы асинхронным-поддержки или asyncContext.addListener (asyncListener) или что-то еще, что я не знаю. Как я никогда не закрываю поток, мне кажется , как мой сервер будет масштабироваться?
Теоретически наилучшим подходом было бы инициировать метод doGet() через серверный код явно при наличии новых данных, поэтому клиенту не нужно запускать клиентскую «onmessage()» - Метод и, следовательно, сторона сервера «doGet()» - метод каждые 3 секунды для новых данных.
Этого является одним из лучших вопросов, которые я видел в SO, хотя я ответил на вопрос, я действительно многому научился, особенно о EventSource! –
Если есть 1000 клиентов, означают ли они, что на сервере будет 1000 соединений? – Harun