-1

请给一些关于以下内容的提示!

先决条件:

  • 副本集类型的 Mongo 集群
  • @EnableReactiveMongoRepositories已就位,所有存储库都从ReactiveMongoRepository
  • @EnableWebFluxSecurity就位,还有一个自定义过滤器用于 Firebase 身份验证
  • Websocket 连接是通过 SocketIO 类型的客户端(不是 SockJS 客户端)从 Flutter UI 建立的

我有以下流程(以下我用 混淆真实的类名SomeClass):

  • UI 中的 SocketIO 订阅是通过WebSocketHandler实现完成的——它基本上从 Mongo 中查询一个给定唯一 ID 的对象(预计只有一项)。处理程序方法的代码非常简单:
   @Override
   public Mono<Void> handle(org.springframework.web.reactive.socket.WebSocketSession session) {
       return session.send(getUserId(session).flatMap(id -> service.findByUserId(id))
               .map(item -> wrapResponse(item, session)));
   }

服务类中的代码也很简单:

    public Mono<SomeClass> findByUserId(String userId){
        return repository.findSomeClassByUserId(userId);
    }
  • 还有一个 REST 端点,我用 PUT 请求调用它来修改 Mongo DB 中的对象。REST 端点的代码也很简单:
@PutMapping("someclass")
    public Mono<SomeClass> saveProfile(@RequestBody SomeClass payload){
        return service.saveSomeClass(payload);
    }

问题是:

  • 有什么方法可以通过已经建立的 WebSocket 会话将 REST 调用中所做的更改传达给给定对象?

考虑和假设:

  • 我正在考虑更改流 - 但它与 SockJS 一起工作得更好sendToUser。说到 SocketIO - 在这种情况下,需要一个活动会话的注册表,这确实使使用反应式风格的利润变得悲惨
  • @Tailable,据我了解,有很大的限制 - 仅用于上限集合,这使得它无法使用。

伙计们,非常感谢任何建议和意见!非常感谢您!

4

1 回答 1

0

到目前为止我发现的唯一方法是使用 Spring Data MongoDB 提供的更改流

于 2021-08-18T08:17:34.573 回答