【问题标题】:MDC is not transfered from Hystrix thread to tomcat threadMDC 没有从 Hystrix 线程转移到 tomcat 线程
【发布时间】:2020-05-23 04:15:03
【问题描述】:

我有一个在 Tomcat 线程 上运行的 classA。 ClassA 正在维护一组 MDC 键值对。

随着 ClassA 的执行,MDC.getCopyOfContextMap() 返回 (A="a", B="b", C="c")

现在,ClassA 调用运行在 Hystrix 线程 上的 classB。

当我们进入 ClassB 时,来自 ClassA 的 MDC 被复制,MDC.getCopyOfContextMap() 返回 (A="a", B="b", C="c")。

ClassB 将变量 X 的值设置为 MDC。 MDC.put("X", String.valueOf("someVal")) 当仍在 ClassB 内时,MDC.getCopyOfContextMap() 返回 (A="a", B="b", C="c", X="someVal")。

ClassA 收到 MDC 并尝试访问变量 X。

MDC.get(X)

但是因为MDC.getCopyOfContextMap() 返回 (A="a", B="b", C="c"),所以它得到了 null。

有什么建议为什么 MDC 没有从 Hystrix 线程转移到 tomcat 线程?

【问题讨论】:

  • 疯狂猜测:不同的类加载器

标签: java multithreading tomcat hystrix mdc


【解决方案1】:

String.valueOf("someVal")

我认为,您必须使用变量而不是“someValue” String.valueOf(变量)

【讨论】:

  • 我实际上是使用不带引号的get方法。修复了帖子
【解决方案2】:

MDC 的工作方式类似于ThreadLocal 的工作方式。它链接到当前线程,并且在线程池的情况下不会自动传输(Hystrix 也使用线程池)。

因此,您需要将 MDC 从主线程复制到 hystrix 线程(虽然不是您的用例),并从 hystrix 线程复制到主线程。

您可以使用 HystrixHook 来完成此操作。

看看这个blog

【讨论】:

  • 添加了来自 ClassA>ClassB>ClassA 的 MDC.getCopyOfContextMap() 流的详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 2019-12-18
相关资源
最近更新 更多