You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:05:16