我试着理解有关钩子执行的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不是,所以我们在途中丢失了值.
任何洞察力都将不胜感激,谢谢!
发布于 2020-04-18 14:47:46
我不是钩子方面的专家,但是在阅读了文档之后,我相信这是你的问题。
onScheduledHooks的docs文档声明如下:
子钩子是一个接受预定运行的函数。它返回装饰的Runnable。
这意味着所提供的函数接受前一个函数,然后将您的内容添加到其中并返回一个新函数。
return (lastFunction) -> {
// Get values from last function and decorate with you stuff ontop
}但是,如果您只想将值从一个线程传递到另一个线程,则应该使用反应性上下文。它就是为了这个目的而构建的,传递线程本地值。
https://projectreactor.io/docs/core/release/reference/#context
https://stackoverflow.com/questions/61279969
复制相似问题