Попытка зарегистрировать стратегию параллелизма 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
Как я могу убедиться, что моя регистрация происходит задолго до любой другой регистрации (которая отсутствует в моем коде, но можетбыть в некоторых библиотеках, которые я могу использовать транзитивно)