当前位置: 首页 > 知识库问答 >
问题:

HystrixRequestContext.GetContextForCurrentThread()变为空

司空温书
2023-03-14

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


在代码块中,在调用remote service之前,我还调用了cache service。remote service在一个单独的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()中获得了null,因此cleanup()在ExecutionSuccess/ExecutionFailure上的NPE失败。
有谁能告诉我们这里发生了什么吗?为什么HystrixRequestContext.GetContextForCurrentThread()变为null,或者为什么HystrixRequestContext.isCurrentThreadInitialized()在从其他服务调用返回后变为false?

当前,我正在检查cleanup方法是否HystrixRequestContext.isCurrentThreadInitialized()为TRUE,然后调用shutdown()方法。如果是假的,什么也别做。

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

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

HystrixRequestContext.GetContextForCurrentThread()在从其他服务返回调用后具有空值

共有1个答案

柳鸿信
2023-03-14

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

 类似资料:
  • 问题内容: 我有一个带有静态实例的android java类,其中包含一个用户信息。但是,在极少数情况下,当用户使用我的应用程序时,该静态实例中的变量之一会在一段时间后变为null。该Java类是全局的(未附加到任何活动)。是什么原因造成的? 编辑:该变量永远不会更改,除非在应用程序启动期间。我已经检查过调用它的函数永远不会被调用一次以上(adb logcat证明了当我添加一条日志表明正在被调用时

  • 我有一个类型为的变量 在一个函数中,我检查它是否为,并希望以后使用它,而不必每次调用都必须。例如,在Kotlin中,IDE识别这样的检查,并在之后断言变量不能为。在C#中有这样的方法吗? 编辑:

  • URL: http://localhost:8080/api/user/2?name=neeru 输出: name=neeru id=null 我也试过 URL: http://localhost:8080/api/user/id=2?name=neeru但获取相同的id值=null 我又添加了一个方法-只有 但结果与路径变量值name=null相同

  • 问题内容: 有什么最短的方法吗? 如果我是正确的,应该用? 有可能,并且在一行中写(也许是数组?)而不重复? 问题答案: 如果要测试变量是否 确实 是,请使用标识运算符: 如果要检查是否未设置变量: 或者,如果变量不为空,则为空字符串,零,..: 如果要测试变量是否不是空字符串,也将足够:

  • 我已经看到了如何在Spring中使用LocalDateTime RequestParam?我得到“未能将字符串转换为LocalDateTime”,但我仍然有问题。 因此编写一个具有rest API的Spring Boot应用程序。 {“时间戳”:“2019-12-19T11:05:21.707+0000”,“状态”:500,“错误”:“内部服务器错误”,“消息”:“值不得为空!;嵌套异常为java