Reactor:使用 Mono<Void> 或像 Mono<Boolean>

问题描述 投票:0回答:1

我有一个使用 Spring 和相关库(包括 Reactor)用 Java 编写的 REST 服务,使用 Mono 来包装昂贵的操作。

我正在使用常用的 CRUD 方法重构数据库相关代码。我遇到过返回类型为

Mono<Void>
的示例,对我来说,这对于只关心成功或失败的方法是有意义的。对于我的用例,例如更新或特别删除数据库条目。

实际上,我在尝试使用

Mono<Void>
时遇到了各种各样的摩擦,当我有一个区域有两种可以并行完成的方法时,这对我来说是一个紧要关头,其中一个方法是返回
Mono<Void> 
,当我使用
Mono.zip
来组合结果时,结果不起作用。我找不到任何方法来组合它们,保持并行性,并使用
Mono<Void>
。有效的方法是将
Mono<Void>
映射到带有虚拟
Mono<Boolean>
Boolean.TRUE
之类的东西。

所以此时我想知道当方法没有真正的返回类型,仅指示成功或错误时,最佳实践是什么。我应该尝试将

Mono<Void>
与我缺少的一些技术一起使用,还是只使用像
Mono<Boolean>
这样的虚拟类型?

java spring project-reactor
1个回答
0
投票

当我去使用 Mono.zip 来合并不起作用的结果时

那是因为你不能将某些东西压缩为空,生成的单声道将是空的。

相反,您可以使用 (1)

Flux.merge
并调用
next
将 Flux 转换为 Mono 或 (2) 或让 mono void 完成然后播放另一个。

    Mono<Void> monoVoid = Mono.empty();
    Mono<Object> monoSomething = Mono.just("something");

    StepVerifier.create(Mono.zip(monoVoid, monoSomething))
        .expectNextCount(0)     // Note: zip results in empty mono
        .expectComplete()
        .verify();

    // Alternative #1
    StepVerifier.create(Flux.merge(monoVoid, monoSomething).next())
        .expectNext("something")
        .expectComplete()
        .verify();

    // Alternative #2
    StepVerifier.create(monoVoid.then(monoSomething))
        .expectNext("something")
        .expectComplete()
        .verify();
© www.soinside.com 2019 - 2024. All rights reserved.