无法在 Spring 中保持 SSE 连接打开

问题描述 投票:0回答:0

我一直在尝试使用以下类使用 SSE 将实时消息发送到 http 客户端:

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

@RestController
public class SSETestController {
    private List<SseEmitter> sseEmitters = new ArrayList<>();

    @GetMapping("/message")
    public SseEmitter eventEmitter() throws IOException {
    SseEmitter sseEmitter = new SseEmitter(Long.MAX_VALUE);
    sseEmitters.add(sseEmitter);
    return sseEmitter;
    }
}

html 文件如下所示:

<!DOCTYPE html>
<html>
<body>

<h1>My First Heading</h1>
<p>My first paragraph.</p>

<script>
    window.onload = function() {
        const eventSource = new EventSource("/message");
        eventSource.addEventListener("message", (event) => {
            const message = JSON.parse(event.data);
            console.log(message);
        });

        eventSource.onerror = function (e) {
            console.log("error");
        }

        eventSource.addEventListener("open", (event) => {
        console.log('connection is live');
        });


    }
</script>

</body>
</html> 

但是当我加载页面时,我在 Firefox 的控制台上收到以下错误:

Firefox can’t establish a connection to the server at http://localhost:8080/message.
我也尝试过使用不同的浏览器,但我得到了相似的结果。

我遵循的几乎所有教程都使用这种方法来建立 SSE 连接,但我似乎无法以某种方式让它工作,是不是我遗漏了什么?

提前致谢。

我试过在返回发射器之前做

sseEmitter.complete()
,但它只会导致连接短暂成功,然后再次中断。然后客户端尝试重新连接到服务器。

java spring server-sent-events
© www.soinside.com 2019 - 2024. All rights reserved.