赞
踩
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <!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>
- 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;
- }
- @GetMapping(path = "push/{userId}")
- public String push(@PathVariable String userId,@RequestBody Map<String,Object> param) throws IOException {
- try {
- SseEmitter sseEmitter = cache.get(userId);
- if (sseEmitter != null) {
- sseEmitter.send(SseEmitter.event().name("msg").data("后端发送消息:" + param));
- }
- } catch (IOException e) {
- log.error("用户[{}]推送异常:{}", userId, e.getMessage());
- cache.remove(userId);
- }
- return "over";
- }
- @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";
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。