SSE EventSource 每 5 秒收到一次“onopen"和“onerror"事件 [英] SSE EventSource is getting 'onopen' and 'onerror' events every 5 seconds
本文介绍了SSE EventSource 每 5 秒收到一次“onopen"和“onerror"事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用 js EventSource 和 spring SseEmitter 实现 SSE 流,但每 5 秒引发一次onerror"和onopen"事件.
I'm implementing SSE stream with js EventSource and spring SseEmitter, but every 5 seconds 'onerror' and then 'onopen' events are raised.
这是服务器端控制器:
@RestController
public class SseController
{
@Autowired
SseService sseService;
@GetMapping(path = "/sseChannel/{userId}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter openSseChannelForUser(@PathVariable int userId)
{
SseEmitter sseEmitter = new SseEmitter();
sseService.addSse(userId, sseEmitter);
return sseEmitter;
}
}
这是javascript:
And this is the javascript:
var sseClient = null;
function sseInit(userId)
{
var url = '/app/spring/sseChannel/'+userId;
sseClient = new EventSource(url);
sseClient.onopen = function ()
{
console.log("onopen() ");
};
sseClient.onmessage = function (evt)
{
console.log("onmessage() "+ evt.data);
};
sseClient.onerror = function (evt)
{
console.log("onerror() ");
};
}
这是控制台:
onopen()
onerror()
onopen()
onerror()
onopen()
onerror()
onopen()
onerror()
.
.
.
推荐答案
超时
@GetMapping(path = "/sseChannel/{userId}"/* , produces = MediaType.TEXT_EVENT_STREAM_VALUE */)
public SseEmitter openSseChannelForUser(@PathVariable int userId)
{
Long timeout = (long) (1000*60);
SseEmitter sseEmitter = new SseEmitter(timeout);
sseService.addSse(userId, sseEmitter);
sseEmitter.onCompletion(() -> {
synchronized (new Object()) {
sseService.removeSse(userId);
}
});
sseEmitter.onTimeout(()-> {
sseEmitter.complete();
});
return sseEmitter;
}
这篇关于SSE EventSource 每 5 秒收到一次“onopen"和“onerror"事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文