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() 变成 null 或 HystrixRequestContext.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() 变为空的主要内容,如果未能解决你的问题,请参考以下文章