HystrixRequestContext.getContextForCurrentThread() 变为空

Posted

技术标签:

【中文标题】HystrixRequestContext.getContextForCurrentThread() 变为空【英文标题】:HystrixRequestContext.getContextForCurrentThread() becoming null 【发布时间】:2019-08-28 14:07:37 【问题描述】:

在我的 springboot 应用程序中,我使用 HystrixCommand 注释包装了一个代码块,以指示该代码块受到保护。 我也使用 THREAD 作为 hystrix 执行隔离策略。由于代码块在单独的线程中运行(hystrix-protected method's commandKey-x),我通过编写自定义 HystrixCommandExecutionHook 来注入 MDC 以在所有日志中添加唯一 id 以使调试更容易。我已经在应用程序启动时注册了自定义插件。 我在 HystrixCommandExecutionHook 的 onStart() 方法中初始化 HystrixRequestContext。

在代码块中,在调用远程服务之前,我还调用了缓存服务,该远程服务在 单独的 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();

由于我在 HystrixRequestContext.getContextForCurrentThread() 中得到空值,cleanup() 在 executionSuccess/executionFailure 上因 NPE 而失败。 任何人都可以对这里发生的事情有所了解吗?为什么返回后 HystrixRequestContext.getContextForCurrentThread() 变成 nullHystrixRequestContext.isCurrentThreadInitialized() 变成 false来自其他服务调用?

解决方法

目前我正在检查清理方法,如果 HystrixRequestContext.isCurrentThreadInitialized() 为 TRUE,然后调用 shutdown() 方法。如果它是 FALSE,不要做任何事情。

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

预期

我希望 HystrixRequestContext.getContextForCurrentThread() 应该包含状态(不应该为空),直到我手动调用 shutdown()

实际

HystrixRequestContext.getContextForCurrentThread() 在调用从其他服务返回后为 null

【问题讨论】:

【参考方案1】:

请为hystrixCommand的服务和调用cleanup()方法的地方提供一些虚拟代码,以便NPE可以复制

【讨论】:

以上是关于HystrixRequestContext.getContextForCurrentThread() 变为空的主要内容,如果未能解决你的问题,请参考以下文章