场景:
在并发情况下两个人同时进行数据导入,插入数据库后数据的创建人id出现获取错乱问题。
分析:
使用的异步CompletableFuture.runAsync(() -> {})线程池为ForkJoin默认线程池,导致变量未传递到异步线程当中
解决:
使用阿里TTL解决,构建单独的线程池给CompletableFuture指定使用
/**
*@author liuxingying
*@description 自定义线程池初始化 一定要单独配置类配置线程池,启动类配置注入会有问题
* 要用TtlExecutors.getTtlExecutor() 修饰线程池
*@since 2024/3/29
*/
@Configuration
public class ThreadPoolConfig {
@Bean(name = "excelExecutor")
public Executor excelExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(50);
executor.setThreadNamePrefix("ExcelExecutor-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return TtlExecutors.getTtlExecutor(executor);
}
}
注入使用:
@Autowired
@Qualifier(value = "excelExecutor")
private Executor executor;
CompletableFuture.runAsync(() -> {},executor)