【问题标题】:Spring boot: SSE Server Sent Events not workingSpring boot:SSE 服务器发送的事件不起作用
【发布时间】: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));
};

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

【问题讨论】:

    标签: javascript spring spring-boot rest server-sent-events


    【解决方案1】:

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

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

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

    【讨论】:

    • CORS 只是在开发过程中使用的,它是一个虚拟程序,用于在实现之前掌握 SSE 的窍门。 Spring Boot 终端刚刚启动,并没有特别记录任何内容。创建值为 -1 的 SSeEmitter 时,您禁用超时。我也用大量数字完成了它并得到了相同的结果。
    • 它是否在终端/cmd 上显示您正在运行 Spring 程序的任何错误消息?
    • 不,没有,根本没有错误。
    猜你喜欢
    • 1970-01-01
    • 2013-09-08
    • 2020-11-04
    • 2018-09-22
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多