Я пытаюсь понять поведение WebFlux в отношении выполнения хуков, но я кое-что не понимаю. Итак, я определил этот хук:
Schedulers.onScheduleHook("hook",
hookToDecorate -> {
log.info("composing {}", hookToDecorate);
return () -> {
log.info("running {}", hookToDecorate);
hookToDecorate.run();
};
});
И вот поток, который я выполняю:
Mono.just("Testing onSchedulerHook")
.timeout(Duration.ofSeconds(3))
.publishOn(Schedulers.elastic())
.block();
Результат следующий:
main 2020-04-17 21:25:16.863 [] INFO --- c.b.t.p.c.w.WebfluxConfigurationTest:45 : composing reactor.core.publisher.MonoDelay$MonoDelayRunnable@6736fa8d
main 2020-04-17 21:25:16.869 [] INFO --- c.b.t.p.c.w.WebfluxConfigurationTest:45 : composing reactor.core.publisher.MonoPublishOn$PublishOnSubscriber@1c852c0f
elastic-2 2020-04-17 21:25:16.871 [] INFO --- c.b.t.p.c.w.WebfluxConfigurationTest:47 : running reactor.core.publisher.MonoPublishOn$PublishOnSubscriber@1c852c0f
Я бы Хотелось бы понять, почему результат первой композиции никогда не называется. Действительно, у меня была надежда, что я мог бы положиться на такую стратегию для передачи локальной переменной потока из одного потока в другой во время выполнения потока (я знаю, что мы не должны этого делать, но давайте представим, что у меня нет выбор), примерно так (код был упрощен):
Schedulers.onScheduleHook("hook",
hookToDecorate -> {
var value = fetchThreadLocalValue();
try {
return () -> {
registerAsThreadLocal(value);
hookToDecorate.run();
};
} finally {
clearThreadLocalValue();
}
});
Но это не работает: во время первой композиции выполняется блок try / finally , но лямбда, которая должна регистрировать значение в локальном потоке, не является, поэтому мы теряем значение в пути ...
Любое понимание будет высоко оценено, спасибо!