【发布时间】:2012-06-08 08:17:27
【问题描述】:
我在页面加载时注册了一个典型的 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 调试器说,“事件源已打开!”成功了。
我的服务器代码是 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);
}
}
代码有效! Client-Code 每 3 秒触发一次 doGet()-Method 并检索新数据。
问题: 但是,我想知道如何通过使用新的 Servlet 3.0 期货(例如 Async-Support 或 asyncContext.addListener(asyncListener) 或其他我不知道的东西)来使这段代码变得更好。由于我从不关闭流,我想知道我的服务器将如何扩展?
理论上,最好的方法是在有新数据时通过服务器端代码显式触发doGet()方法,因此客户端不需要触发客户端“onmessage()”方法因此服务器端“doGet()”-每隔 3 秒获取一次新数据。
【问题讨论】:
-
这是我在 SO 中见过的最好的问题之一,虽然我回答了这个问题,但我实际上从中学到了很多东西,尤其是关于 EventSource!
-
如果有 1000 个客户端,是否意味着将有 1000 个连接到服务器?
标签: html servlets server-sent-events