| | |
| | | |
| | | |
| | | import com.google.common.util.concurrent.ThreadFactoryBuilder; |
| | | import com.ltkj.db.DataSourceContextHolder; |
| | | import com.ltkj.framework.aspectj.AsynAspect; |
| | | import com.ltkj.framework.datasource.DynamicDataSourceContextHolder; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | @Configuration |
| | | @Slf4j |
| | | public class ThreadPoolConfiguration { |
| | | private static final Logger logger = LoggerFactory.getLogger(AsynAspect.class); |
| | | |
| | | private static final Logger logger = LoggerFactory.getLogger(ThreadPoolConfiguration.class); |
| | | |
| | | @Bean(name = "async", destroyMethod = "shutdown") |
| | | public ThreadPoolExecutor systemCheckPoolExecutorService() { |
| | | // 获取当前线程的数据源 |
| | | String dataSource = DynamicDataSourceContextHolder.getDataSourceType(); |
| | | logger.info("异步传递线程当前线程数据源: {}", dataSource); |
| | | // 获取当前线程的 DataSource |
| | | String currentDataSource = DataSourceContextHolder.getDataSourceKey(); |
| | | logger.info("当前线程数据源: {}", currentDataSource); |
| | | |
| | | return new ThreadPoolExecutor(3, 10, 60, TimeUnit.SECONDS, |
| | | new LinkedBlockingQueue<>(10000), |
| | | new ThreadFactoryBuilder().setNameFormat("default-executor-%d").build(), |
| | | (r, executor) -> logger.error("system pool is full! ")) { |
| | | (r, executor) -> log.error("system pool is full! ")) { |
| | | |
| | | @Override |
| | | public void execute(Runnable task) { |
| | | // 包装任务,将数据源传递到异步线程 |
| | | super.execute(new Runnable() { |
| | | @Override |
| | | public void run() { |
| | | // 在异步线程中设置数据源 |
| | | String dataSource = DynamicDataSourceContextHolder.getDataSourceType(); |
| | | try { |
| | | DynamicDataSourceContextHolder.setDataSourceType(dataSource); |
| | | task.run(); |
| | | } finally { |
| | | // 确保在任务执行完成后清理数据源 |
| | | DynamicDataSourceContextHolder.clearDataSourceType(); |
| | | } |
| | | public void execute(Runnable command) { |
| | | // 包装任务,确保数据源被传递到新线程 |
| | | super.execute(() -> { |
| | | String dataSourceKey = DataSourceContextHolder.getDataSourceKey(); |
| | | try { |
| | | // 传递数据源到子线程 |
| | | DynamicDataSourceContextHolder.setDataSourceType(dataSourceKey); |
| | | command.run(); // 执行任务 |
| | | } finally { |
| | | // 任务完成后清理数据源上下文 |
| | | DynamicDataSourceContextHolder.clearDataSourceType(); |
| | | } |
| | | }); |
| | | } |
| | | }; |
| | | } |
| | | |
| | | } |
| | | |
| | | |