【发布时间】:2021-10-13 01:38:05
【问题描述】:
请给一些关于以下内容的提示!
先决条件:
- 副本集类型的 Mongo 集群
-
@EnableReactiveMongoRepositories已就位,所有存储库都从ReactiveMongoRepository扩展 -
@EnableWebFluxSecurity就位,还有一个自定义过滤器用于 Firebase 身份验证 - Websocket 连接是通过 SocketIO 类型的客户端(不是 SockJS 客户端)从 Flutter UI 建立的
我有以下流程(以下我用SomeClass混淆真实的类名):
- 来自 UI 的 SocketIO 订阅是通过
WebSocketHandler实现完成的 - 它基本上从 Mongo 查询一个给定唯一 ID 的对象(预计只有一项)。 handler方法的代码很简单:
@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,据我了解,有很大的限制——只用于有上限的集合,这使得它无法使用。
各位,我们非常感谢任何建议和意见! 提前非常感谢您!
【问题讨论】:
-
请不要描述您的代码,而是包含足够的代码以及您想要建立的小示例,询问。投票结束,缺乏调试细节。
-
@Toerktumlare,感谢您的回复!请您对“您想建立什么”更具体一点吗?正如我所说:我想对数据库中的实体进行更改,并希望通过反应器功能将它们传播到 UI 而不使用事件/侦听任何内容等。差不多就是这样
-
@Toerktumlare,是的 - 试图描述我想减轻可能的回复的代码 - 阅读文档。我已经阅读了它们,但关于 websockets(非 SockJS 的)和 Spring Mongo Reactive 的特定用法并没有太多 - 因此,也许有人可能有一些相关的经验。我只是想提供一些背景
标签: flutter websocket spring-webflux spring-websocket spring-data-mongodb-reactive