我一直在尝试使用以下类使用 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()
,但它只会导致连接短暂成功,然后再次中断。然后客户端尝试重新连接到服务器。