SSE EventSource 每 5 秒收到一次“onopen"和“onerror"事件 [英] SSE EventSource is getting 'onopen' and 'onerror' events every 5 seconds

查看:246
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆