当前位置: 首页 > 知识库问答 >
问题:

在Spring Boot应用程序中发出有关资源更新的服务器发送事件

养学
2023-03-14

我不熟悉服务器发送的事件。我正在使用React前端的Spring Boot应用程序。

在这里,我们有一个要求,如果同时多个用户在UI中打开一个资源,那么应用需要通知所有这些用户,以防其中一个用户正在更新同一资源。

在这方面,我正在搜索一篇相关文章,以便将服务器发送事件与我的Spring Boot应用程序集成,我发现:https://betterprogramming.pub/server-sent-events-on-react-and-spring-webflux-5f532b04633.

由此,我了解到,我必须向现有的Spring Boot应用程序添加web flux依赖项,并公开一个用于发出事件的endpoint。

但是在我的应用程序中,资源的更新正在使用终结点:/api/resource1完成,并且事件将从具有另一个终结点的应用程序中发出:/api/end-point-2如下:

负责更新对象的主要资源终结点如下所示:

 @RestController
    public class ResourceController {
    
        @CrossOrigin(allowedHeaders = "*")
        @GetMapping(value = "/api/resource1/")
        public MyObj updateMyObj(MyObj myObj) {
           ...
           return myRepository.save(myObj);
        }
    }

负责发出事件的其他endpoint将如下所示:

@RestController
public class ResourceController { //THIS IS GOING TO NOTIFY THE CLIENTS AT 1 SEC INTERVAL

    @CrossOrigin(allowedHeaders = "*")
    @GetMapping(value = "/api/end-point-2/", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<MyObj> getMyObj() {
    
        return Flux.interval(Duration.ofSeconds(1))
                .map(it ->  <NOT ABLE TO UNDERSTAND WHAT SHOULD I WRITE HERE>);

    }
}

在这里,我无法理解,第一终端中的更新将如何传达给第二终端以通知客户端。

有人能帮忙吗?谢了。

共有1个答案

袁弘方
2023-03-14

我面临着非常相似的问题。看起来FluxSink可能有助于存储发出的事件。

然后,您可以使用ApplicationEventPublisher发布保存的实体或适当的信息:< code>MyObjSavedEvent。

另一方面,此解决方案需要在体系结构结构上进行更多更改,并且似乎非常适合 CQRS 和事件溯源方法,我们将事件存储在事件存储中。

我还在研究可能的解决方案。如果我发现有用的东西,我会告诉你的。

 类似资料:
  • 我有一个后端服务器,它将事件作为服务器发送的事件发送给客户端。我还没有找到一个好的库来在Android上处理这项技术,所以我一直在使用一种回退方法,定期检查服务器(通过访问事件endpoint)中的新事件。 后台服务每10秒执行一次。不用说,这不是最好的方法。如果没有任何开源库可用于此场景,那么在内存使用和电池消耗方面,定期检查服务器后端是否有新事件的最佳方法是什么?与在Android中管理开放式

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 问题内容: 我正在尝试使用SSE将JSON数据发送到浏览器,但似乎无法正确处理,而且我也不知道为什么。 服务器端看起来像这样: 如您所见,我已经注释掉了帖子内容,但最终我希望将testdata用作JSON本身,如下所示: 客户端看起来像这样: 我看到控制台日志,但 没有看到警报。 问题答案: 尝试发送适当的JSON(输出中未引用): 但最好:

  • 我试图让服务器发送的事件与Mozilla Firefox一起工作。给定一个Spring Boot的网络服务 使用Chrome浏览器或Edge(始终是最新版本)可以正常工作。我可以在网络分析器选项卡中看到未完成的请求,并且每秒都会显示一个新的时间戳。 然而,当我使用Firefox(84.0.2或更早版本)时,请求也会显示在网络选项卡中,但不会显示响应头或流数据。当我终止Spring后端时,Firef

  • 当前,我已经在Express API上为服务器发送的事件设置了一个endpoint,当我从cmd调用endpoint时,使用http://localhost:3000/v1/devices,我得到了流,但当我使用新事件源从Vue应用程序调用endpoint时('http://localhost:3000/v1/devices“)但它只会继续加载,而不会流式传输任何数据。是否有我目前没有做的事情要做