Java Spring SseEmitter / ResponseBodyEmitter:检测浏览器重载 - java

我在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,对吗?您的问题出在旧版本上,它不再具有客户端端点。

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

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

从您的代码看来,您似乎有一个列表或一组发射器。您是否可以将其设置为地图,以某些客户端身份作为键,以发射器作为值?

我无法确切告诉您要用作客户身份的信息,因为这完全取决于您的应用程序。在我的情况下,这是一个JWT令牌,但您可能只需创建一个客户端编号方案即可。

Java:“自动装配”继承与依赖注入 - java

Improve this question 我通常以常见的简单形式使用Spring框架: 控制器服务存储库通常,我会在CommonService类中放一个通用服务,并使所有其他服务扩展到类中。一个开发人员告诉我,最好在每个服务中插入CommonClass而不是使用继承。我的问题是,有一个方法比另一个更好吗? JVM或性能是否会受到另一个影响?更新资料Comm…

Spring Data Cassandra的事务管理 - java

我正在使用Spring和Cassandra作为基础数据库。曾提到过弹簧伞项目“ spring data cassandra”。与休眠不同,在这里无法找到如何管理事务。如果您中的某些人已经合并,请共享要包含的事务管理器的详细信息。 参考方案 Cassandra不支持传统(ACID)的事务。在某些特殊情况下,可以通过一些构造来实现事务原子性,例如原子批处理(请参…

Spring Boot:java.time.Duration的默认序列化从字符串更改为数字 - java

我们最近从Spring Boot 2.1.9升级到2.2.1,这导致我们的测试失败。调查导致结果,默认情况下java.time.Duration类型现在序列化为不同的序列。现在,我们将得到"PT15M",而不是在JSON消息中包含字符串"900.0"。 POJO定义如下所示@JsonProperty(required …

Spring Boot-使用上下文路径时在根级别的静态内容 - java

假设我有一个application.yml内容server: port: 8000 context-path: /rest 因此,将像这样访问所有控制器和htmlhttp://server:8000/rest/controller因此,具有此配置...有可能在不更改其上下文路径的情况下将一些静态html元素添加到其根级别? (我已经将index.html添加…

IntelliJ Spring MVC教程部署 - java

我尝试了tutorial,当我尝试部署webapp(IntelliJ 13.1.4 Ultimate)时,出现了一个奇怪的错误,如下面的屏幕快照所示。解决此错误的方法是什么? org.jdom.input.JDOMParseException: Error on line 742: The content of elements must consist o…