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

时间:2015-12-30 13:31:32

标签: java spring

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

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

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

/v:on

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

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

1 个答案:

答案 0 :(得分:4)

当浏览器重新加载时,它会为您的服务器建立一个新的EventSource,对吧?你的问题是旧问题,它没有客户端点。

我建议您尝试检测它是否是连接相同的客户端,然后在旧发射器上显式调用complete。

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

从您的代码中,您似乎有一个列表或一组发射器。您是否可以将其改为地图,其中您有一些客户端身份作为密钥,而发射器作为值?

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