1、pom文件
XML
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、前端代码
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title> Springboot集成SSE </title>
</head>
<script>
let source = null;
const clientId = new Date().getTime();
if (!!window.EventSource) {
source = new EventSource('http://127.0.0.1:8080/sse/subscribe?id=' + clientId);
//建立连接
source.onopen = function (event) {
setMessageInnerHTML("建立连接" + event);
}
//接收数据
source.onmessage = function (event) {
setMessageInnerHTML(event.data);
}
//错误监听
source.onerror = function (event) {
if (event.readyState === EventSource.CLOSED) {
setMessageInnerHTML("连接关闭");
} else {
console.log(event);
}
}
} else {
setMessageInnerHTML("浏览器不支持SSE");
}
window.onbeforeunload = function () {
close();
};
// 关闭
function close() {
source.close();
const httpRequest = new XMLHttpRequest();
httpRequest.open('GET', '/sse/over/?clientId=' + clientId, true);
httpRequest.send();
console.log("close");
}
// 显示消息
function setMessageInnerHTML(innerHTML) {
document.getElementById('text').innerHTML += innerHTML + '<br/>';
}
</script>
<body>
<button onclick="close()">关闭连接</button>
<div id="text"></div>
</body>
</html>
3、后端代码
1、订阅
java
private static Map<String, SseEmitter> cache = new ConcurrentHashMap<>();
@GetMapping(path = "subscribe", produces = {MediaType.TEXT_EVENT_STREAM_VALUE})
public SseEmitter subscribe(@RequestParam(name = "id", required = false) String id) throws IOException {
// 超时时间设置
SseEmitter sseEmitter = new SseEmitter(0L);
cache.put(id, sseEmitter);
//结束连接
sseEmitter.onCompletion(() -> {
log.info("结束连接:{}", id);
cache.remove(id);
});
//连接异常
sseEmitter.onError(throwable -> {
log.info("连接异常:{}", id);
cache.remove(id);
});
//连接超时
sseEmitter.onTimeout(() -> {
log.info("连接超时:{}", id);
cache.remove(id);
});
return sseEmitter;
}
2、推送
java
@GetMapping(path = "push/{userId}")
public String push(@PathVariable String userId,@RequestBody Map<String,Object> param) throws IOException {
try {
SseEmitter sseEmitter = cache.get("123");
if (sseEmitter != null) {
sseEmitter.send(SseEmitter.event().name("msg").data("后端发送消息:" + param));
}
} catch (IOException e) {
log.error("用户[{}]推送异常:{}", userId, e.getMessage());
cache.remove(userId);
}
return "over";
}
3、关闭
java
@GetMapping(path = "over")
public String over(@RequestParam(name = "id", required = false) String id) {
SseEmitter sseEmitter = cache.get(id);
if (sseEmitter != null) {
sseEmitter.complete();
cache.remove(id);
}
return "over";
}