我一直期待着回答同一个样的问题,当涉及到SSE,这里是我的研究:
我有一个基本的javax的HttpServlet,将打印数据每RANDO秒一个PrintWriter。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
System.out.println("You just entered the doGetMethod");
response.setContentType("text/event-stream");
response.setCharacterEncoding("UTF-8");
PrintWriter printWriter = null;
while(true){
try{
System.out.println("You just entered the while loop");
double randomNumber = Math.random()*10000;
printWriter = response.getWriter();
printWriter.print("data: " + "[next server time check event in " +
Math.round(randomNumber/1000) + " seconds]\n");
printWriter.print("data: " + "Time: " + Calendar.getInstance().getTime() + "\n\n");
response.flushBuffer();
Thread.sleep((long)randomNumber);
} catch (IOException | InterruptedException e){
e.printStackTrace();
break;
}
}
System.out.println("Connection was aborted");
}
这里是填补了{textarea的ID =“displayTextArea}元素
<script>
var eventSource = null;
function start(){
eventSource = new EventSource('http://localhost:8080/SSEServlet');
eventSource.onopen = function(){displayTextArea.value+='Connected ..' + '\n';};
eventSource.onmessage = function(message){displayTextArea.value+=message.data + '\n\n';};
eventSource.onerror = function(){displayTextArea.value+='Error Occurred...' + '\n';};
}
function stop(){
eventSource.close();
}
function clearText(){
displayTextArea.value = '';
}
</script>
脚本 - 要回答你的第一个问题:
如果你看控制台当您运行应用程序中,您将注意到控制台不会打印“您刚刚输入了doGetMethod”,直到您向Servlet路径发送HTTP GET请求为止,这确认了Servlet实例和req/resp对象不会在有人呼叫servlet。How do servlets work?
- 第二和第三个问题:
默认情况下,Tomcat将为每个连接分配一个线程(Source)。在我目前的配置下,我的程序最多可以连接6个连接。每个连接都将创建它自己的servlet实例,并且在连接打开时,将保留在while循环中。当我运行服务器并打开单独的连接,看到不同的时间和随机间隔的顺序时,这已被证明。我的while循环不是无限的,虽然它一直等到连接关闭,然后会抛出异常并中断while循环。连接关闭后,servlet将关闭。
我这样做的方式非常非常做业余SSE的方式。如果你想为此学习高级图书馆,我会退房jeaSSE
如果有人想要完整code