【发布时间】:2020-04-17 20:16:39
【问题描述】:
我尝试了解 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 块被执行,但应该在本地线程中注册值的 lambda 没有,所以我们丢失了值在路上……
任何见解将不胜感激,谢谢!
【问题讨论】:
标签: spring-webflux project-reactor