gpt4 book ai didi

java - 在执行程序服务中记录父线程名称

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:10:22 27 4
gpt4 key购买 nike

我在 spring 集成上下文中使用 Spring task:executor。当任务被调用时,日志如下所示:
2015-04-21 10:56:14,371 INFO [com.Class] (activatorExecutor-2:null) 处理用户:abc
下面是我的 log4j 转换模式:
%d %-5p [%c] (%t:%x) %m%n %throwable{10}

问题是,是否可以将调用线程的名称放入 MDC 中,或者作为子线程名称的前缀,如下所示:
2015-04-21 10:56:14,371 INFO [com.Class] (activatorExecutor-2:parentThread1) 处理用户:abc
或者这个:
2015-04-21 10:56:14,371 INFO [com.Class] (parentThread1_activatorExecutor-2:null) 处理用户:abc
这样我就可以关联回哪个线程激活了这个执行程序任务。谢谢。

最佳答案

我没有针对此问题的成熟且深思熟虑的解决方案,但我建议您查看 Java Configuration approach .

我可以看到您应该能够选择 Executor 的实现以用于通过 @EnableAsync 运行您的线程和 AsyncConfigurer .示例中提供的实现 ( ThreadPoolTaskExecutor ) 有一个方法 ExecutorConfigurationSupport#setThreadFactory(ThreadFactory)您可以使用它来自定义线程的创建方式。

您可以创建 ThreadFactory 的实现,它利用委托(delegate) ThreadFactory 来实际创建线程,但您现在将拥有一个允许您命名线程的 Hook 根据你的标准。如上所述将其连接起来,希望它对您有用。

 @Configuration
@EnableAsync
public class AppConfig implements AsyncConfigurer {

@Bean
public MyAsyncBean asyncBean() {
return new MyAsyncBean();
}

@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(7);
executor.setMaxPoolSize(42);
executor.setQueueCapacity(11);
//executor.setThreadNamePrefix("MyExecutor-");
executor.setThreadFactory(myThreadFactory());
executor.initialize();
return executor;
}

public ThreadFactory myThreadFactory() {
return new MyCustomThreadFactoryThatKnowsHowToProperlyNameThreads();
}

@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return MyAsyncUncaughtExceptionHandler();
}
}

这是未经深思熟虑的部分发挥作用的地方。我想我会让您提出最适合您需求的 ThreadFactory 实现。

关于java - 在执行程序服务中记录父线程名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29780540/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com