HystrixRequestContext.getContextForCurrentThread () становится нулевым - PullRequest
1 голос
/ 07 апреля 2019

В приложении Springboot я обертываю блок кода аннотацией HystrixCommand, чтобы указать, что блок кода защищен.Также я использую THREAD в качестве стратегии изоляции исполнения Hystrix.Поскольку блок кода выполняется в отдельном потоке (hystrix- {commandKey защищенного метода -x), я внедряю MDC, написав специальный HystrixCommandExecutionHook для добавления уникального идентификатора во все журналы, чтобы упростить отладку.И я зарегистрировал пользовательский плагин при запуске приложения.
Я инициализирую HystrixRequestContext в onStart () метод HystrixCommandExecutionHook.


В блоке кода у меня также есть вызов службы кэширования перед вызовом удаленной службы, которая снова запускается в отдельном потоке Hystrix.Я узнал об этом, проверив имя потока (hystrix- {cacheService's commandKey} -x) из журналов.

@Override
 public <T> void onStart(HystrixInvokable<T> commandInstance) {
   HystrixRequestContext.initializeContext();
   Map<String, String> originalMDCContext = MDC.getCopyOfContextMap();
   if (originalMDCContext != null && !originalMDCContext.isEmpty()) {
      mdcContextVariable.set(originalMDCContext);
    }
  }

Проблема, с которой я сталкиваюсь, заключается в том, что когда вызов службы кэширования завершен и управление возвращается к следующей строке в блоке кода, значение HystrixRequestContext.getContextForCurrentThread () будет нулем .Я видел HystrixRequestContext.isCurrentThreadInitialized () будет иметь FALSE значение.Если блок кода генерирует исключение, очистка в методе onExecutionFailure завершается с NPE.Код очистки выглядит следующим образом:

private void cleanup() {
  HystrixRequestContext.getContextForCurrentThread().shutdown();
}

Поскольку я получаю значение NULL в HystrixRequestContext.getContextForCurrentThread () , cleanup () не работает с NPEна выполнениеSuccess / executeFailure.
Кто-нибудь может пролить свет на то, что здесь происходит?Почему HystrixRequestContext.getContextForCurrentThread () становится null или почему HystrixRequestContext.isCurrentThreadInitialized () становится false после возврата из вызова другой службы?

Обходной путь

В настоящее время я проверяю в методе очистки, является ли HystrixRequestContext.isCurrentThreadInitialized () ИСТИНА, а затем вызывает метод shutdown () .Если это FALSE, ничего не делать.

private void cleanup() {
if(HystrixRequestContext.isCurrentThreadInitialized() == Boolean.TRUE)
  HystrixRequestContext.getContextForCurrentThread().shutdown();
}

Ожидается

Я ожидаю, что HystrixRequestContext.getContextForCurrentThread () должен содержать состояние (не должно быть нулевым), пока я не вызову shutdown () для него вручную.

Actual

HystrixRequestContext.getContextForCurrentThread () имеет нулевое значение после возврата вызова из другой службы

1 Ответ

0 голосов
/ 06 мая 2019

Пожалуйста, предоставьте некоторый фиктивный код для сервисов с hystrixCommand и местом, где вызывается метод cleanup(), чтобы можно было реплицировать NPE

...