首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合成但未执行的WebFlux钩子

合成但未执行的WebFlux钩子
EN

Stack Overflow用户
提问于 2020-04-17 20:16:39
回答 1查看 827关注 0票数 2

我试着理解有关钩子执行的WebFlux行为,有些东西我不明白。所以我定义了这个钩子:

代码语言:javascript
复制
        Schedulers.onScheduleHook("hook",
                                  hookToDecorate -> {
                                      log.info("composing {}", hookToDecorate);
                                      return () -> {
                                          log.info("running {}", hookToDecorate);
                                          hookToDecorate.run();
                                      };
                                  });

下面是我执行的流程:

代码语言:javascript
复制
        Mono.just("Testing onSchedulerHook")
            .timeout(Duration.ofSeconds(3))
            .publishOn(Schedulers.elastic())
            .block();

其产出如下:

代码语言:javascript
复制
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

我想知道为什么第一篇作文的结果从来不被称为。实际上,我希望能够依赖这样的策略,以便在执行流时将线程局部变量从一个线程传递到另一个线程(我知道我们不应该这样做,但让我们假设我没有选择),有点像这样(代码已经简化了):

代码语言:javascript
复制
        Schedulers.onScheduleHook("hook",
                                  hookToDecorate -> {
                                      var value = fetchThreadLocalValue();
                                      try {
                                          return () -> {
                                              registerAsThreadLocal(value);
                                              hookToDecorate.run();
                                          };
                                      } finally {
                                          clearThreadLocalValue();
                                      }
                                  });

但是它不起作用:在第一个组合过程中,会执行try/finally块,但是应该在线程本地注册值的lambda不是,所以我们在途中丢失了值.

任何洞察力都将不胜感激,谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-04-18 14:47:46

我不是钩子方面的专家,但是在阅读了文档之后,我相信这是你的问题。

onScheduledHooks的docs文档声明如下:

子钩子是一个接受预定运行的函数。它返回装饰的Runnable。

这意味着所提供的函数接受前一个函数,然后将您的内容添加到其中并返回一个新函数。

代码语言:javascript
复制
return (lastFunction) -> {
    // Get values from last function and decorate with you stuff ontop
}

但是,如果您只想将值从一个线程传递到另一个线程,则应该使用反应性上下文。它就是为了这个目的而构建的,传递线程本地值。

https://projectreactor.io/docs/core/release/reference/#context

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61279969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档