Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-为多线程创建日志上下文_Java_Multithreading_Logging - Fatal编程技术网

Java-为多线程创建日志上下文

Java-为多线程创建日志上下文,java,multithreading,logging,Java,Multithreading,Logging,我目前正在开发事件/活动日志系统,我正在使用方法拦截器将其作为一个方面来实现。目前,系统/框架假设每个方法都是一个活动,但我想扩展它,以便一个活动可以跨越多个方法调用。为了做到这一点,首先想到的方法是为所有相关的方法调用提供一些上下文。然而,我只知道在所有方法调用都在单个线程的上下文中(如Log4J的MDC/NDC)时实现这一点的方法。是否有任何方法可以为多线程提供上下文(可能代码不知道多线程)?Class ThreadLocal?这种类似于它的sems实际上可能是TLS的一种有效且合理的用途—

我目前正在开发事件/活动日志系统,我正在使用方法拦截器将其作为一个方面来实现。目前,系统/框架假设每个方法都是一个活动,但我想扩展它,以便一个活动可以跨越多个方法调用。为了做到这一点,首先想到的方法是为所有相关的方法调用提供一些上下文。然而,我只知道在所有方法调用都在单个线程的上下文中(如Log4J的MDC/NDC)时实现这一点的方法。是否有任何方法可以为多线程提供上下文(可能代码不知道多线程)?

Class ThreadLocal?这种类似于它的sems实际上可能是TLS的一种有效且合理的用途——在已经存在的代码中添加一个cotext

本地类?这种类似于它的sems实际上可能是TLS的一种有效且合理的用途——在已经存在的代码中添加一个cotext

不要考虑“日志记录”。它涉及到一个更基本的问题:如果您希望在同一上下文中处理多个线程执行的操作,您将传播什么来让每个线程知道它们所处的上下文

如果您可以回答这个问题,那么这个上下文就是您需要放在MDC/NDC中进行日志记录的内容(可能不是整个上下文,而是该上下文中的一些关键信息)

如果您的应用程序没有携带此类信息,任何人都无法为您确定


编辑:

我可能会给你一些关于如何执行设置的想法。是否适合使用AOP来进一步增强它,这是您进一步研究的内容:)

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

不要考虑“日志记录”。它涉及到一个更基本的问题:如果您希望在同一上下文中处理多个线程执行的操作,您将传播什么来让每个线程知道它们所处的上下文

如果您可以回答这个问题,那么这个上下文就是您需要放在MDC/NDC中进行日志记录的内容(可能不是整个上下文,而是该上下文中的一些关键信息)

如果您的应用程序没有携带此类信息,任何人都无法为您确定


编辑:

我可能会给你一些关于如何执行设置的想法。是否适合使用AOP来进一步增强它,这是您进一步研究的内容:)

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

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

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

我不确定我是否正确理解了这一点。无论如何,因为这种方法是面向方面的,所以后台会有一个组件负责跟踪上下文,比如ContextManager。我希望对其进行结构设计,以便无论如何执行任何方法,无论是在与原始执行堆栈相同或不同的线程中,上下文都保持不变。我不确定我在这里是否有意义;我对多线程没有太多经验(至少不是直接的),问题是“与原始执行堆栈是在同一个线程内还是在不同的线程内”。通常,可以合理地认为同一堆栈中的方法调用堆栈位于同一上下文下。但是,当您有其他线程要执行时,除了您之外,没有人知道正确的上下文。例如,您有一个作业调度器,它将线程池的作业放入运行。如果希望“上下文”成为用户会话,则必须为新线程设置上下文。我相信在这种情况下,某些特定的fw设置特定的上下文,但只有你知道你真正想要什么,我不确定我是否理解正确。无论如何,因为这种方法是面向方面的,所以后台会有一个组件负责跟踪上下文,比如ContextManager。我希望对其进行结构设计,以便无论如何执行任何方法,无论是在与原始执行堆栈相同或不同的线程中,上下文都保持不变。我不确定我在这里是否有意义;我对多线程没有太多经验(至少不是直接的),问题是“与原始执行堆栈是在同一个线程内还是在不同的线程内”。通常,可以合理地认为同一堆栈中的方法调用堆栈位于同一上下文下。但是,当您有其他线程要执行时,除了您之外,没有人知道正确的上下文。例如,您有一个作业调度器,它将线程池的作业放入运行。如果希望“上下文”成为用户会话,则必须为新线程设置上下文。我相信在这种情况下,某些特定的fw设置特定的上下文,但只有你知道你真正想要的是什么,这就是我计划使用的。我只是不确定它是否仍然适用于多线程。ThreadLocal是为了解决多线程中的某些问题(在我的回答中,ContextManager通常是在内部使用ThreadLocal实现的)。您应该考虑的主要问题是如何将上下文内容传送到另一个线程。请记住,有很多方法可以让你的应用程序多线程。每次产生一个新线程通常是最糟糕的方法。您执行多线程的方式肯定会影响
// 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();
}