java - 将 then 与 Mono<Void> 一起使用时出现意外行为

标签 java project-reactor reactive-streams

组合多个 Mono<Void> 时使用.then(Mono<Void>)它们没有按预期顺序运行。

有人可以解释一下下面的工作代码和非工作代码之间的区别吗?

工作代码

StepVerifier.create(
        repository.incrementCounter(bucket, timeStamp)
                .then(repository.incrementCounter(bucket, timeStamp))
                .then(Mono.just(1).flatMap(t -> repository.resetCounter(bucket, timeStamp)))
                .then(Mono.just(1).flatMap(t -> repository.getCounter(bucket, timeStamp))))
        .expectNext(0L)
        .verifyComplete();

不工作

StepVerifier.create(
        repository.incrementCounter(bucket, timeStamp)
                .then(repository.incrementCounter(bucket, timeStamp))
                .then(repository.resetCounter(bucket, timeStamp))
                .then(repository.getCounter(bucket, timeStamp)))
        .expectNext(0L)
        .verifyComplete();

最佳答案

根据 Gitter channel ,您的存储库应该返回冷 Mono(又名“惰性”),但您很可能在返回之前就开始调用。

您可以使用Mono.defer来使其变冷。

关于java - 将 then 与 Mono<Void> 一起使用时出现意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56705592/

相关文章:

scala - 将元素从外部推送到 fs2 中的 react 流

java - 如何对Flux进行移动窗口计算并将结果作为新的Flux输出

java - 如何在 CentOS 上运行 Java EE 应用程序

java - LibGDX - 平移相机时屏幕上没有任何变化

java - 骡子 ESB : How the threads names are managed?

java - Reactor 取消订阅的方式

java - 如何使用 Spring data-mongodb-reactive 从上限集合中进行流式传输

scala - Akka 流 : At-Least-Once-Delivery behaviour with Kafka and Cassandra

java - 如何响应式下载和处理大数据?

java - Hibernate - 使用生成的复合键插入临时子实体