| New file |
| | |
| | | package com.example.erp.common; |
| | | |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.PreDestroy; |
| | | import java.util.concurrent.*; |
| | | |
| | | /** |
| | | * 全局异步查询执行器 |
| | | * 统一管理线程池,支持在多个 Service 并行执行 SQL 查询任务 |
| | | */ |
| | | @Component |
| | | public class AsyncQueryExecutor { |
| | | |
| | | // 全局可复用线程池 |
| | | private final ExecutorService executorService = new ThreadPoolExecutor( |
| | | 16, // 核心线程数 |
| | | 32, // 最大线程数 |
| | | 60L, TimeUnit.SECONDS, // 空闲线程存活时间 |
| | | new LinkedBlockingQueue<>(500), // 阻塞队列容量 |
| | | new ThreadFactory() { |
| | | private final ThreadFactory defaultFactory = Executors.defaultThreadFactory(); |
| | | private int counter = 1; |
| | | |
| | | @Override |
| | | public Thread newThread(Runnable r) { |
| | | Thread thread = defaultFactory.newThread(r); |
| | | thread.setName("async-query-pool-" + counter++); |
| | | thread.setDaemon(true); |
| | | return thread; |
| | | } |
| | | }, |
| | | new ThreadPoolExecutor.CallerRunsPolicy() // 队列满时主线程执行,防止丢任务 |
| | | ); |
| | | |
| | | /** |
| | | * 异步执行任务 |
| | | * @param supplier 要执行的函数(返回任意类型) |
| | | * @param <T> 返回类型 |
| | | * @return CompletableFuture<T> |
| | | */ |
| | | public <T> CompletableFuture<T> runAsync(SupplierWithException<T> supplier) { |
| | | return CompletableFuture.supplyAsync(() -> { |
| | | try { |
| | | return supplier.get(); |
| | | } catch (Exception e) { |
| | | throw new RuntimeException("异步任务执行异常: " + e.getMessage(), e); |
| | | } |
| | | }, executorService); |
| | | } |
| | | |
| | | /** |
| | | * 应用关闭时安全关闭线程池 |
| | | */ |
| | | @PreDestroy |
| | | public void shutdown() { |
| | | executorService.shutdown(); |
| | | try { |
| | | if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) { |
| | | executorService.shutdownNow(); |
| | | } |
| | | } catch (InterruptedException e) { |
| | | executorService.shutdownNow(); |
| | | Thread.currentThread().interrupt(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 自定义函数式接口,允许抛出受检异常 |
| | | */ |
| | | @FunctionalInterface |
| | | public interface SupplierWithException<T> { |
| | | T get() throws Exception; |
| | | } |
| | | } |