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 发送事件
Spring Boot 自动配置的 Jackson ObjectMapper 默认不用于 WebFlux WebClient