【问题标题】:Setting ThreadContext for all threads in application为应用程序中的所有线程设置 ThreadContext
【发布时间】:2017-03-18 08:18:30
【问题描述】:

从这个答案https://stackoverflow.com/a/25125159/4367326 我有routingAppender 工作,但我想为程序中的每个线程设置ThreadContext

当我设置时

ThreadContext.put("logFileName", "TestLogFile");

它适用于主线程并按预期记录,但不适用于我的应用程序中的任何其他线程。我怎样才能做到这一点?

【问题讨论】:

    标签: java multithreading log4j log4j2


    【解决方案1】:

    如果您将系统属性 isThreadContextMapInheritable 设置为 true,则每个子线程都将继承父线程 ThreadContext 状态。但这不适用于 Executors,因此您需要手动将数据从一个线程复制到另一个线程。

    更新#2

    你可以这样做:

    public abstract class ThreadContextRunnable implements Runnable {
    
      private final Map context = ThreadContext.getContext();
    
      @Override
      public final void run() {
        if (context != null) {
          ThreadContext.putAll(context);
        }
        try {
          runWithContext();
        } finally {
          ThreadContext.clearAll();
        }
      }
    
      protected abstract void runWithContext();
    }
    

    然后你只需要实现runWithContext方法。

    【讨论】:

    • 对于执行者,我可以在他们为所有执行者孩子调用的类的 run() 中设置 ThreadContext 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多