Я играл с отменами в проекте-реакторе и столкнулся с таким странным поведением: когда в одной цепочке издателей есть два родственных doOnCancel
метода, и они отменяют в разных планировщиках, первый запускается (что всегда кажется быть последним) блокирует работающий позже. Может ли кто-нибудь объяснить это поведение?
Например, когда я запускаю этот блок кода
Disposable disposable = Mono.fromCallable(() -> "A")
.doOnCancel(() -> log.info("Cancel A"))
.cancelOn(Schedulers.newElastic("Can-Sched-A"))
.doOnCancel(() -> {
log.info("Cancel B");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
})
.cancelOn(Schedulers.newElastic("Can-Sched-B"))
.delayElement(Duration.ofSeconds(1))
.subscribeOn(Schedulers.boundedElastic())
.subscribe(System.out::println);
Thread.sleep(100);
disposable.dispose();
Thread.sleep(5000);
Мы получаем следующий вывод, в котором мы видим, как журнал Cancel A
появляется через две секунды после Cancel B
:
2020-04-15 11:16:26 [Can-Sched-B-4] INFO somePackage.SomeTestClass - Cancel B
2020-04-15 11:16:28 [Can-Sched-A-5] INFO somePackage.SomeTestClass - Cancel A