【问题标题】:WebFlux hook composed but not executedWebFlux 钩子组成但未执行
【发布时间】: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


    【解决方案1】:

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

    onScheduledHooks 的文档说明如下:

    sub-hook 是一个接受调度 Runnable 的函数。它返回 装饰的 Runnable。

    意思是提供的函数接受前一个函数,然后你将你的东西添加到它并返回一个新函数。

    return (lastFunction) -> {
        // Get values from last function and decorate with you stuff ontop
    }
    

    但是,如果您只想在线程之间传递值,则应该使用响应式上下文。它就是为此目的而构建的,传递线程本地值。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-23
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多