在上一篇文章中我们主要介绍 tomcat nio 中的流式上传文件,其本质是直接拿到上传文件的网络输入流,然后在应用程序中读取并操作。避免了以磁盘作为中转,从而提高了效率。这里我们主要介绍服务端事件 SSE。
SSE 的简称是 Server-Sent Events,其本质是浏览器发送一个请求到服务端建立一个长连接,在这个长连接基础上客户端多次发送 http 请求,来轮询服务端是否有数据需要返回给浏览器。所以 SSE 是建立在浏览器和服务端长连接基础上的多次 http 轮询请求,但是 SSE 支持断开重连(由浏览器自己实现),简化了连接关闭情况下操作,但是 SSE 对浏览器和服务器都有要求:
下面我们示例简单的服务端代码和客户端代码:
@GetMapping(path="/test-sse", produces="text/event-stream;charset=UTF-8")
@ResponseBody
public String testServerSentEvent(HttpServletRequest request) throws Exception{
Thread.sleep(300);
//Logic to impl here
return "data:"+ Math.random()+"\n\n";
}
<!DOCTYPE html>
<html>
<head>
<title>Test SSE Page</title>
</head>
<script type="text/javascript">
var source = new EventSource('http://127.0.0.1:1033/basic-service/test-controller/test-sse');
source.onmessage = function(event){
console.info(event.data);
document.getElementById('result').innerText=event.data;
}
</script>
<body class="blank">
<div id="result"></div>
</body>
</html>
SSE运行效果:



SSE基于长连接:



客户端主动关闭:
细心的同学可能发现,不是说 tomcat 默认长连接超过100个请求就会关闭么,但是主动关闭方的 time_wait 却出现在浏览器端,这是为什么呢。

对于 SSE 总结如下:
目前先写到这里,下一篇文章里我们继续介绍 tomcat 中的异步请求。