Spring Cloud Sleuth 线程池的跟踪
概述
- 解决异步线程池和内部线程池,链路跟踪丢失问题,Sleuth提供一个包装类:
LazyTraceAsyncCustomizer
包装,通过他可以实现异步线程池或线程内部的链路跟踪信息 - 异步线程池稍微复杂一点,此处使用自定义
AsyncConfigurer
实现,详情参考代码和配置
线程池定义-JAVA代码
#1. 代码实现
import java.util.concurrent.Executor;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ThreadPoolExecutor;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.sleuth.instrument.async.LazyTraceAsyncCustomizer;
import org.springframework.cloud.sleuth.instrument.async.LazyTraceThreadPoolTaskExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
public class ThreadPoolConfig {
@Autowired
private BeanFactory beanFactory;
@Bean
public AsyncConfigurer asyncConfigurer() {
return new LazyTraceAsyncCustomizer(this.beanFactory, new AsyncConfigurer() {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(Runtime.getRuntime().availableProcessors() * 2);
executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() * 20);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("Yk-async-task-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (throwable, method, obj) -> {
System.err.println("zidingyi " + throwable);
};
}
});
}
@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setThreadNamePrefix("Yk-task-");
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
threadPoolTaskExecutor.setQueueCapacity(1000);
threadPoolTaskExecutor.setCorePoolSize(Runtime.getRuntime().availableProcessors() * 2);
threadPoolTaskExecutor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() * 20);
threadPoolTaskExecutor.initialize();
return new LazyTraceThreadPoolTaskExecutor(beanFactory, threadPoolTaskExecutor);
}
}
application文件配置
spring:
sleuth:
async:
configurer:
enabled: false