1

我正在学习调度程序是如何工作的。所以我尝试将数字设置为 100。使用 publishOn 它可以工作(它将数字设置为 100),但是使用 subscribeOn 它没有将数字设置为 100。我不明白为什么?

@Test
fun reactor01_LearnSchedulers(){
  var number = 0
  Mono.just(100)
    .doOnNext { numb -> number = numb }
    // .subscribeOn(Schedulers.boundedElastic()) this gives result: 0
    .publishOn(Schedulers.boundedElastic()) // this gives result: 100
    .subscribe()

  println("Result : $number")
}

更新:添加一些代码后,我发现结果不一致。

fun reactor01_LearnSchedulers(){
  var number = 0
  Mono.just(100)
    .doOnNext { numb -> number = numb }
    .doOnNext { println("Result from inside: $number") }
    .publishOn(Schedulers.boundedElastic())
    .subscribe()

  println("Result from outside: $number")
  // with publishOn Result from inside: 100, Result from outside: 100
  // with subscribeOn Result from outside: 0, Result from inside: 100
}
4

1 回答 1

2

这里的问题在于时间和理解线程转移如何在 Reactor 中工作。

当您这样做时subscribe(),您将在具有该反应流定义的同一线程上或在您在subscribeOn().

这里publishOn()是独立的,不会影响订阅者的行为。

因此,当您有 a publishOn()but notsubscribeOn()时,subscribe()您仍然可以使流程在与整个测试方法相同的线程中执行。在整个流评估println()之后执行。subscribe()但是,当您添加时subscribeOn(),流程的订阅和执行发生在该线程上,使主线程可以自由地继续执行代码中的下一条语句。因此,由于您处于异步情况,因此将number其设置为预期值并不幸运。

我建议您学习StepVerifier了解如何测试所有这些 Reactor 流:https ://projectreactor.io/docs/core/release/reference/#testing

于 2021-12-15T19:56:51.270 回答