我目前正在研究事件/活动日志系统,我正在使用方法拦截器实现这一方面。目前,系统/框架假定每个方法都是一个活动,但我想扩展它,以便活动可以跨越多个方法调用。为了做到这一点,首先想到的方法是为所有相关的方法调用提供一些上下文。但是,如果所有方法调用都在单个线程(如Log4J的MDC / NDC)的上下文中,我只知道一种方法。有没有办法为多个线程提供上下文(可能没有代码知道多线程)?
答案 0 :(得分:4)
不要考虑“伐木”。它更具基本性:如果你想在同一个上下文中处理多个线程完成的操作,那么你传播的是让每个线程知道它们所处的上下文?
如果您可以回答这个问题,那么您需要将此上下文放在MDC / NDC中进行日志记录(可能不是整个上下文,而是该上下文中的一些关键信息)。
如果您的申请没有附带此类信息,那么任何人都无法为您确定这些信息。
编辑:
我可以就你如何进行设置提出一些建议。是否适合使用AOP进一步增强它,这是你的进一步研究:)
// Assume I have a ContextManager which Context is stored in thread local:
abstract class ContextAwaredJob implements Runnable {
public ContextAwaredJob() {
this.context = ContextManager.getCurrentContext();
}
public void run() {
ContextManager.setCurrentContext(this.context);
doRun();
}
protected abstract void doRun();
}
你新的“job”将扩展这个父类,如果你通过另一个线程运行它,将自动设置上下文。 (当然,设计的设计可以很多,但它会给你一个基本的想法)
答案 1 :(得分:1)
ThreadLocal类?这个sems就像它实际上可能是TLS的有效和合理使用 - 为已存在的代码添加上下文。
答案 2 :(得分:1)
我偶然发现了InheritableThreadLocal,我认为这可能对我的代码有效。这假设所有相关的线程都是从某个父/根线程产生的(我认为这是一个安全的假设)。