我有一个运行在Tomcat线程上的类A。类A维护着一组MDC键值对。
当ClassA被执行时,MDC.getCopyOfContextMap()
返回(A=“a”,B=“b”,C=“c”)
现在,ClassA调用在Hystrix线程上运行的ClassB。
当我们进入ClassB时,来自ClassA的MDC被复制,并且MDC.getCopyOfContextMap()
返回(A=“a”,B=“b”,C=“c”)。
类B将变量X的值设置到MDC中。MDC.put("X", String.valueOf("someVal"))
当仍在类B中时,MDC.getCopyOfContextMap()
返回(A=“a”,B=“b”,C=“c”,X=“someVal”)。
ClassA接收MDC并尝试访问变量X。MDC.get(X)
但是它得到的是空值,因为MDC.getCopyOfContextMap()
返回(A=“a”,B=“b”,C=“c”)。
为什么MDC没有从Hystrix线程转移到tomcat线程,有什么建议吗?
2条答案
按热度按时间kupeojn61#
字符串.valueOf(“某个值”)
我认为,你必须使用变量而不是“someValue”String.valueOf(variable)
rqqzpn5f2#
MDC
的工作方式与ThreadLocal
的工作方式类似。它链接到当前线程,并且在线程池的情况下不会自动传输(Hystrix也使用线程池)。因此,您需要将
MDC
从主线程复制到hystrix线程(虽然不是您的用例),并从hystrix线程复制到主线程。您可以使用HystrixHook来完成此操作。
看看这个blog