2012-04-16 62 views
1

我目前的工作活动/活动记录系统,其中我采取的方法使用的拦截记录方面的背景。目前,系统/框架假设每个方法都是一个活动,但我想扩展它以便一个活动可以跨越多个方法调用。为了做到这一点,首先想到的方法是为所有相关的方法调用提供一些上下文。但是,如果所有方法调用都在单个线程的上下文中(例如Log4J的MDC/NDC),我只知道一种方法。有没有办法为多线程提供上下文(可能没有代码意识到多线程)?爪哇 - 创建多个线程

回答

1

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

+1

它不是那么简单。一个潜在的问题是这样的:http://stackoverflow.com/questions/7296623/inheritablethreadlocal-and-thread-pools。这就是为什么我总是强调这样的背景需要以一种明确的方式来设置。 – 2012-04-20 02:20:18

+0

我现在唯一遇到的问题就是我正在处理的应用程序目前没有明确的线程产生。某些第三方API可能会在后台执行此操作,但目前为止我还没有意识到这一点。我对目前InheritableThreadLocal提供的对多线程上下文的有限支持非常满意。我一定会记下你的建议,以便在将来遇到此类问题时使用它们。谢谢。 – 2012-04-21 01:58:43

1

类的ThreadLocal?这表明它实际上可能是TLS的有效合理使用 - 为已存在的代码添加cotext。

+0

其实这就是我打算使用的。我只是不确定它是否仍然可以使用多线程。 – 2012-04-16 12:08:07

+0

ThreadLocal是为了解决多线程中的某些问题(在我的回答中,ContextManager通常是在ThreadLocal内部实现的)。您应该考虑的主要问题是将上下文内容传送到另一个线程的方式。请记住,有很多方法可以使您的应用程序成为多线程。每次产生新线程通常是最糟糕的方式。您如何执行多线程将肯定会影响您传播环境的方式。 – 2012-04-20 02:26:08

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

你新的“工作”是要扩展这个父类,如果你是通过运行此背景下会自动安装另一个线程。 (课程设计可以进行很多改进,但是它给出了关于发生的事情的基本想法)

+0

+1,绝对。不知怎的,这种背景必须建立起来。 – 2012-04-16 09:05:12

+0

我不确定我是否理解正确。无论如何,因为这种方法是面向方面的,所以会在后台有一个组件,负责跟踪上下文,比如ContextManager。我想这样构造它,无论如何执行任何方法,无论是在与原始执行堆栈相同还是不同的线程中,上下文都保持不变。我不确定我在这里是否有意义;我没有太多的多线程经验(至少不是直接)。 – 2012-04-16 12:05:53

+0

问题是“是否在与原始执行堆栈相同或不同的线程内”。通常情况下,同一堆栈中的方法调用堆栈可以合理地认为是在同一个上下文中。但是,当你有其他线程执行时,除了你以外没有人知道正确的上下文。例如,你有一个为线程池运行作业的作业调度器。你希望“context”是用户会话,你必须为新线程设置上下文。我相信在这种情况下一些特定的fw设置特定的上下文,但只有你知道你真正想要什么 – 2012-04-17 01:28:52