1

我目前正在研究事件/活动记录系统,我正在使用方法拦截器将其作为一个方面来实现。目前,系统/框架假设每个方法都是一个活动,但我想扩展它,以便一个活动可以跨越多个方法调用。为了做到这一点,想到的第一种方法是为所有相关的方法调用提供一些上下文。但是,如果所有方法调用都在单个线程的上下文中(如 Log4J 的 MDC/NDC),我只知道一种方法。有没有办法为多个线程提供上下文(可能没有代码知道多线程)?

4

3 回答 3

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();
}

你的新“工作”将扩展这个父类,如果你正在由另一个线程运行它,上下文将自动设置。(当然,设计可以改进很多,但它可以让用户对正在发生的事情有基本的了解)

于 2012-04-16T08:49:20.040 回答
1

类 ThreadLocal?这似乎实际上可能是 TLS 的有效且合理的用途 - 将 cotext 添加到已经存在的代码中。

于 2012-04-16T08:16:01.920 回答
1

我偶然发现了InheritableThreadLocal,我认为它适用于我的代码。这是假设所有相关线程都是从某个父/根线程产生的(我认为这是一个安全的假设)。

于 2012-04-18T04:23:26.700 回答