Java中Mono与MonoSink的区别是什么?
Mono与MonoSink的核心区别
Mono和MonoSink同属Reactor的reactor.core.publisher包,但二者定位、用法完全不同,是协作而非替代的关系,给你直白拆解:
1. 核心定位不一样
- Mono:是响应式流的发布者(Publisher),代表一个可被订阅的异步数据序列(最多包含1个元素)。你代码里的
private final Mono<MyModel2> mono;就是一个现成的发布者,订阅它就能触发背后的逻辑,获取MyModel2类型的数据、空结果或者错误信息。 - MonoSink:是Mono的手动控制器,它本身不是发布者,而是用来向指定Mono发送数据、标记完成或错误的工具。你代码里的
private final MonoSink<MyModel1> sink;,应该是从某个Mono的创建逻辑中保存下来的“开关”,用来在后续任意时机手动触发数据发射。
2. 使用场景完全不同
- Mono的常见用法:
- 直接包装数据或异步操作:比如
Mono.just(new MyModel2())创建包含固定数据的Mono;Mono.fromCallable(() -> 数据库查询MyModel2())把同步阻塞逻辑转为异步响应式流。 - 作为方法返回值对外暴露响应式接口:比如写一个
public Mono<MyModel2> fetchData()方法,调用方订阅后就能异步获取结果。
- 直接包装数据或异步操作:比如
- MonoSink的常见用法:
- 当你需要手动控制数据流时机时用,最典型的是通过
Mono.create(sink -> { ... })创建Mono,在回调里拿到MonoSink并保存起来,之后在事件回调、定时任务等场景中,调用sink.next(new MyModel1())发送数据、sink.complete()标记序列完成、sink.error(new Exception())发送错误信号。
- 当你需要手动控制数据流时机时用,最典型的是通过
3. 生命周期与协作逻辑
Mono是完整的发布者,包含订阅、执行、发射的全流程;MonoSink必须依附于某个Mono存在,当对应的Mono被取消订阅时,MonoSink的操作会失效。打个比方:Mono是一根“水管”,MonoSink就是水管的“水龙头”,你通过水龙头控制什么时候放水、关水,或者报告水管漏水。
内容的提问来源于stack exchange,提问作者MrDk
相关产品推荐
相关产品推荐

