Крюк WebFlux составлен, но не выполнен - PullRequest
1 голос
/ 17 апреля 2020

Я пытаюсь понять поведение 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 , но лямбда, которая должна регистрировать значение в локальном потоке, не является, поэтому мы теряем значение в пути ...

Любое понимание будет высоко оценено, спасибо!

1 Ответ

0 голосов
/ 18 апреля 2020

Я не гуру на крючках, но после прочтения документации я верю, что это ваша проблема.

Документы для onScheduledHooks Состояния следующие:

Подпрограмма hook - это функция, принимающая запланированный Runnable. Он возвращает оформленный Runnable.

Это означает, что предоставленная функция принимает прежнюю функцию, а затем вы добавляете в нее свои вещи и возвращаете новую функцию.

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

Но если вы просто хотите передать значения из потока в поток, вы должны вместо этого использовать реактивный контекст. Он был построен только для этого, передавая локальные значения потока.

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

...