从ReactiveMongo仓库返回Mono时,数据库调用是否会在后台自动启动?
Spring WebFlux ReactiveMongo返回Mono的运行逻辑答疑
问题1:数据库调用是否在Mono返回后就立即启动?
不会。你给出的示例代码中,reactiveMongoRepo.findItemById("123")执行时仅会生成一个描述数据库查询操作的Mono实例,属于纯内存操作,不会发起任何真实的数据库调用,方法执行结束后数据库不会收到任何请求。
问题2:是否需要对该Mono执行subscribe操作才会触发数据库调用?底层运行原理是什么?
是的,必须调用subscribe()才会触发数据库调用,这是响应式流规范(Reactive Streams)约定的惰性求值特性。
底层运行原理如下:
- ReactiveMongo仓库返回的
Mono属于冷发布者(Cold Publisher):没有订阅者时仅保存操作的元信息,不会执行任何IO逻辑,只有被订阅时才会触发实际执行。 - 调用
subscribe()后底层执行流程如下:- Reactor框架反向组装整个响应式操作链,初始化请求上下文
- 从MongoDB异步连接池中申请可用连接
- 构造对应的BSON查询请求,通过异步非阻塞IO发送到MongoDB服务端
- 接收到服务端返回的查询结果后,反序列化为指定的Java实体对象,沿着操作链传递给订阅者定义的处理回调
- 补充说明:如果是在Spring WebFlux的Controller层直接将该
Mono作为接口返回值,不需要手动调用subscribe(),Spring WebFlux框架会在请求处理流程中自动完成订阅,并将最终结果写入HTTP响应。
内容的提问来源于stack exchange,提问作者ng.newbie
相关产品推荐
相关产品推荐

