Spring boot:SSE 服务器发送的事件不起作用

Posted

技术标签:

【中文标题】Spring boot:SSE 服务器发送的事件不起作用【英文标题】:Spring boot: SSE Server Sent Events not working 【发布时间】:2022-01-16 12:24:52 【问题描述】:

在 Spring Boot 中,当我们尝试发送 Server Sent Event 时,它只会在我们尝试连接时发送一个包含数据的错误事件:"timeout":-1,然后连接关闭。 Spring Boot类如下

@RestController
@CrossOrigin(origins = "*")
public class SsePushNotificationRestController 
    private static final Logger log = LoggerFactory.getLogger(SsePushNotificationRestController.class);
    private SseEmitter emitter;

    @GetMapping("/test")
    public String getString()
        try 
            emitter.send("User connected");
            log.info("User connected");
            emitter.complete();
         catch (Exception e) 
            log.info("Error while sending message to client: " + e.getMessage());
        
        return "placeholder";
    

    @GetMapping("/emitter")
    public SseEmitter eventEmitter(@RequestParam String userId) 
        emitter = new SseEmitter(-1L);
        return emitter;
    

而我们的客户端代码如下:

const eventSource = new EventSource('http://localhost:8080/emitter?userId=testUser');

eventSource.addEventListener("message", (event) => 
    console.log(event);
);

eventSource.addEventListener("open", (event) => 
    console.log("connection opened");
);

eventSource.addEventListener("error", (e) => 
    if (e.readyState === EventSource.CLOSED) 
        console.log('closed');
    
    else 
        console.log(e);
    
    e.target.close();
);

document.getElementById("btn").onclick = e => 
    fetch('http://localhost:8080/test').then( data => console.log(data)).catch(data => console.log(data));
;

立即,在我们可以单击按钮生成事件之前创建一个错误。 有什么问题?

【问题讨论】:

【参考方案1】:

你的 Spring Boot 终端是怎么说的?我想我需要这些信息来解决您的程序错误。顺便说一句,允许对来自任何来源的请求(使用通配符)进行跨源资源共享是一种非常糟糕的做法。

一个可能的错误原因是创建 SSEemitter 实例时出现问题。 (新的 SSeEmitter(-1L))

SSeEmitter(Long timeout) 正在创建设置超时的服务器端事件。所以如果超时为-1,我猜它会立即超时并返回超时响应。所以这不会是错误,就像写的那样工作

【讨论】:

CORS 只是在开发过程中使用的,它是一个虚拟程序,用于在实现之前掌握 SSE 的窍门。 Spring Boot 终端刚刚启动,并没有特别记录任何内容。创建值为 -1 的 SSeEmitter 时,您禁用超时。我也用大量数字完成了它并得到了相同的结果。 它是否在终端/cmd 上显示您正在运行 Spring 程序的任何错误消息? 不,没有,根本没有错误。

以上是关于Spring boot:SSE 服务器发送的事件不起作用的主要内容,如果未能解决你的问题,请参考以下文章

服务器使用 Spring Boot 和 WebFlux 发送事件

收到服务器发送事件并立即发现错误导致 SSE 关闭

Spring Boot 自动配置的 Jackson ObjectMapper 默认不用于 WebFlux WebClient

Spring中的SSE(服务器端事件)——存储SseEmitters

服务器发送事件 + Java 与 Spring MVC

服务器端事件发送SSE