加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Java spring SseEmitter / ResponseBodyEmitter:检测浏览器重新

发布时间:2020-12-15 01:43:10 所属栏目:大数据 来源:网络整理
导读:我在Java Spring中使用服务器端事件(SSE).每当新客户端订阅事件服务时,我在REST控制器上执行以下代码: SseEmitter emitter = new SseEmitter(-1L);emitter.onCompletion(() - { logger.debug(TAG + "Emitter completed."); emitters.remove(emitter); });re

我在Java Spring中使用服务器端事件(SSE).每当新客户端订阅事件服务时,我在REST控制器上执行以下代码:

SseEmitter emitter = new SseEmitter(-1L);
emitter.onCompletion(() -> {
        logger.debug(TAG + "Emitter completed.");
        emitters.remove(emitter);
    });
return emitter;

然后,每当需要将事件通知给我执行的客户端时:

 for (ResponseBodyEmitter emitter: emitters) {
        emitter.send("Message #1");
 }

问题是当其中一个客户端重新加载浏览器时,发射器没有完成(正如我所料),并且在调用上面的代码时我得到一个损坏的管道异常.只有在触发此异常后,我才会看到发射器已完成.

有没有办法解决这个问题?

最佳答案
当浏览器重新加载时,它会为您的服务器建立一个新的EventSource,对吧?您的问题是旧的问题,它不再具有客户端端点.

我建议你尝试检测它是同一个客户端连接,然后在旧发射器上显式调用完成.

在我的情况下,我可以根据EventSource传入的令牌检测到这一点作为URL参数.当我将新创建的发射器挂钩到“用户对象”时,我确保在将新的发射器分配给用户字段变量之前完成前一个发射器.

从您的代码中,您似乎有一个列表或一组发射器.你可以把它改成地图,你有一些客户端身份作为密钥,发射器作为值吗?

我无法准确地告诉您要用作客户身份的信息,因为这完全取决于您的应用程序.在我的例子中,它是一个JWT令牌,但你可以简单地创建一个客户编号方案……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读