Mono.fromCompletionStage即时执行版的适用场景及包装器选型疑问
两种
Mono.fromCompletionStage实现的差异与选择 核心差异
先明确最关键的区别:
- 非lambda版:调用
client.deleteMessage(message)会立即执行(在装配阶段),生成的CompletableFuture直接被包装成Mono。 - lambda版:
client.deleteMessage(message)会延迟到Mono被订阅时才执行,完全遵循Reactor的“订阅驱动”模型。
非lambda版的适用场景
只有两种情况适合用非lambda版:
- 任务必须立即启动,不受后续流状态影响:比如某些初始化异步操作,或者你明确知道不管后续逻辑是否订阅、是否失败,这个任务都要执行。
- 使用预先创建好的CompletionStage:如果
client.deleteMessage(message)不是当前方法内创建的,而是从外部传入的现成CompletableFuture实例,用非lambda版直接包装即可,不需要延迟创建。
包装器的最优选择
必须选lambda版,理由如下:
- 避免你提到的严重副作用:如果用非lambda版,
delete操作会在Mono装配时就执行,完全脱离Reactor的流控制。比如你举的例子:
不管.process(message).then(myWrapper.delete(message))process成功还是失败,delete都会触发,这显然不符合业务逻辑预期。 - 作为库封装者,应该把符合Reactor规范的行为内置,而不是让使用者自己用
Mono.defer去补救——这会增加使用者的学习成本,还容易因为遗忘导致难以排查的bug。
内容的提问来源于stack exchange,提问作者user6412004
相关产品推荐
相关产品推荐

