java - SignalType.CANCEL 忽略publishOn操作符

标签 java project-reactor

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

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()

最佳答案

只有当信号从源发出并向下游传播时,才会调用 publishOn 运算符。

但是,取消请求会被转发到上游,然后执行处理程序。源不发出取消信号。

关于java - SignalType.CANCEL 忽略publishOn操作符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54403312/

相关文章:

java - 线程 "main"java.lang.NoClassDefFoundError : org/bouncycaSTLe/crypto/PBEParametersGenerator 中出现异常

java - org.xml.sax.SAXParseException : Invalid byte 2 of 3-byte UTF-8 sequence

java - 通过 SSE 订阅的 Flux 引发 cancel() 事件

java - 如何在 Spring Web MVC Controller 中利用非阻塞请求

spring-boot - 如何在 Spring WebFlux 中记录请求和响应主体

java - 您建议使用什么结构来保存一堆字符串对象关联?

Java不会将所有内容写入文件

java - 静态资源的相对路径

java - 如何使用 Project Reactor 重复或重试动态值?

reactor - Reactor 会提供远程处理吗?