SSE и Servlet 3.0

Я зарегистрировал типичное SSE при загрузке страницы:

Клиент:

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-отладчик говорит, что "источник событий открыт!" было успешно.

Код моего сервера — это сервлет 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 Futures, такие как Async-Support или asyncContext.addListener(asyncListener) или что-то еще, чего я не знаю. Поскольку я никогда не закрываю поток, мне интересно , как мой сервер будет масштабироваться?

Теоретически, лучшим подходом было бы явно запускать метод doGet() через код на стороне сервера, когда появляются новые данные, поэтому клиенту не нужно запускать метод onmessage() на стороне клиента. и, следовательно, серверная сторона "doGet ()" - метод каждые 3 секунды для новых данных.

16
задан nimo23 4 June 2012 в 08:16
поделиться