В приложении 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 () имеет нулевое значение после возврата вызова из другой службы