SignalType.CANCEL 忽略 publishOn 运算符

我想知道为什么取消信号的处理方式与其他方式不同。有人知道这是不是故意的吗?


Scheduler scheduler = Schedulers.elastic();


Disposable disposable =

   Flux.interval(Duration.ofSeconds(1))

       .publishOn(scheduler)

       .doFinally(signalType -> {

           if (signalType == SignalType.CANCEL) {

               // caller thread  - why ??

           } else {

              // elastic thread

           }

       }).log()

      .subscribe();

例如


Mono.just(1)

    .delayElement(Duration.ofSeconds(3))

    .doFinally(signalType -> {

        disposable.dispose();

     })

    .subscribe();

产生输出:


14:37:36.308 [main] INFO reactor.Flux.DoFinallyFuseable.1 - | onSubscribe([Fuseable] FluxDoFinally.DoFinallyFuseableSubscriber)

14:37:36.308 [main] INFO reactor.Flux.DoFinallyFuseable.1 - | request(unbounded)

14:37:37.324 [elastic-2] INFO reactor.Flux.DoFinallyFuseable.1 - | onNext(0)

14:37:38.324 [elastic-2] INFO reactor.Flux.DoFinallyFuseable.1 - | onNext(1)

14:37:39.325 [elastic-2] INFO reactor.Flux.DoFinallyFuseable.1 - | onNext(2)

14:37:39.387 [parallel-2] INFO reactor.Flux.DoFinallyFuseable.1 - | cancel()


Thread.sleep(4000);

disposable.dispose();

产生输出:


14:39:22.380 [main] INFO reactor.Flux.DoFinallyFuseable.1 - | onSubscribe([Fuseable] FluxDoFinally.DoFinallyFuseableSubscriber)

14:39:22.380 [main] INFO reactor.Flux.DoFinallyFuseable.1 - | request(unbounded)

14:39:23.412 [elastic-2] INFO reactor.Flux.DoFinallyFuseable.1 - | onNext(0)

14:39:24.412 [elastic-2] INFO reactor.Flux.DoFinallyFuseable.1 - | onNext(1)

14:39:25.414 [elastic-2] INFO reactor.Flux.DoFinallyFuseable.1 - | onNext(2)

14:39:26.400 [elastic-2] INFO reactor.Flux.DoFinallyFuseable.1 - | onNext(3)

14:39:26.400 [main] INFO reactor.Flux.DoFinallyFuseable.1 - | cancel()


慕田峪7331174
浏览 86回答 1
1回答

慕桂英3389331

仅当publishOn信号从源发出并传播到下游时,才会调用操作符。然而,取消请求被转发到上游,然后处理程序被执行。源不发出取消信号。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java