我有一个系统,其中包含使用 JMS 和 Spring Integration 连接在一起的多个应用程序。消息沿着一系列应用程序发送。
[应用程序 A] -> [应用程序 B] -> [应用程序 C]
我们在消息头中设置了一个全局 ID,以便我们可以通过系统跟踪每个消息的生命周期。
我希望能够在系统中的任何日志消息前添加消息全局 ID。
还有其他人这样做过吗?有什么方法可以将此变量关联到线程,以便我可以在将来的方法中访问它吗?我不想在系统的方法中传递变量。
最佳答案
我认为 ThreadLocal 可能就是您想要的,尽管有些人可能会发现这种方法滥用了 ThreadLocal 的目的或良好的设计。像这样的东西:
public class MyIDManager {
public static final ThreadLocal<Long> myID = new ThreadLocal<Long>();
}
...
// set ID at some point
MyIDManager.myID.set(theNewID);
...
// read it later
long currentID = MyIDManager.get();
这里的神奇之处在于 myID 的值实际上是特定于线程的,并且从不同线程访问时会有所不同。
然后您可以使用 ID 执行您喜欢的操作,包括记录它。
关于java - 在多个组件中记录全局 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1701493/