Регистрация стратегии параллелизма Hystrix не выполняется после перехода на spring-boot-2.0 - PullRequest
2 голосов
/ 12 июня 2019

Попытка зарегистрировать стратегию параллелизма Hystrix завершается неудачно после перехода на Spring-boot-2.0 с включенным пружинным приводом с java.lang.IllegalStateException , заявляющим, что "Другая стратегия уже зарегистрирована" .Это хотя я не использовал registerConcurrencyStrategy в другом месте в моем коде.

Я бы хотел зарегистрировать стратегию параллелизма для переноса контекста Log MDC, чтобы я мог одинаково хорошо регистрироваться как внутри, так и за пределами упакованного метода Hystrix, который включает в себя локальные потоки.И это прекрасно работало в spring-boot-1.5

. После перехода на spring-boot 2.0 (с версии 1.5) HystrixPlugins.getInstance (). RegisterConcurrencyStrategy (this); завершается ошибкойс IllegalStateException

В соответствии с https://github.com/Netflix/Hystrix/issues/1057, эта проблема может возникать, если либо (a) любой другой поток кода зарегистрировал бы свой собственный или заданный по умолчанию ConcurrencyStrategy до того, как это будет вызвано (b) любой вызов произошел бы черезHystrix до того, как это будет вызвано

Так как вышеупомянутый вызов находится внутри конструктора класса, который аннотирован @Component, он должен вызываться в идеале, прежде чем произойдет любой вызов метода (кроме инициализации других bean-компонентов, включая их конструкторы).

Мы даже пытались переместить этот код в основной метод класса приложения SpringBoot, прежде чем вызывать SpringApplication.run (MyApplication.class, args); , но это также не сработало

@Component
public class ContextCopyHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy {

    private static final String EVENT = "HystrixConcurrencyStrategy";
    private static final String ACTION = "ContextCopy";

    public ContextCopyHystrixConcurrencyStrategy(Logger logger, LoggerUtil defaultLoggerUtil) {

        try {
            HystrixPlugins.getInstance().registerConcurrencyStrategy(this);
        } catch (IllegalStateException e) {
            defaultLoggerUtil.logEvents(logger, Level.WARN, e.getMessage(), EVENT, ACTION, "", "Race condition! Could not register strategy. HystrixConcurrencyStrategy is already initialized.");
        }

Ожидается: моя регистрация должна была произойти раньше, чем любой другой коди регистрация должна была быть успешной

Фактически: моя регистрация не удалась с IllegalStateException

Как я могу убедиться, что моя регистрация происходит задолго до любой другой регистрации (которая отсутствует в моем коде, но можетбыть в некоторых библиотеках, которые я могу использовать транзитивно)

Ответы [ 2 ]

1 голос
/ 12 июня 2019

По умолчанию компенсатор Spring boot 2 регистрирует Hystrix Metric Binder bean-компонентов, которые сбрасывают уже установленный HystrixConcurrencyStrategy и устанавливают HystrixConcurrencyStrategyDefault. Итак, отключение этого бина с помощью

management.metrics.binders.hystrix.enabled=false

поможет не сбросить пользовательский HystrixConcurrencyStrategy

1 голос
/ 12 июня 2019

Мы внимательно посмотрели на мои классы каталогов .m2 maven и искали registerConcurrencyStrategy внутри всех классов во всех банках. И мы обнаружили, что

io.micrometer.core.instrument.binder.hystrix

внутренне регистрировал HystrixConcurrencyStrategy со значением по умолчанию.

И после дальнейших исследований мы обнаружили, что задаем следующее свойство в application.properties: management.metrics.binders.hystrix.enabled = false отключил механизм связывания метрик Hystrix (хотя я на самом деле не уверен, что он делает!), А затем все заработало

...