package com.ard.work.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.Executor; import java.util.concurrent.ThreadPoolExecutor; @Configuration @EnableAsync public class AsyncConfiguration { /** * 相机SDK专用异步线程池 */ @Bean("cameraSdkExecutor") public Executor cameraSdkExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 核心线程数:根据业务并发量调整 executor.setCorePoolSize(10); // 最大线程数 executor.setMaxPoolSize(50); // 队列容量 executor.setQueueCapacity(500); // 线程空闲时间 executor.setKeepAliveSeconds(60); // 线程名前缀 executor.setThreadNamePrefix("camera-sdk-"); // 拒绝策略:队列满时由调用线程执行(避免任务丢失) executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 初始化 executor.initialize(); return executor; } /** * 相机任务线程池(控制相机并发) */ @Bean("cameraPTZExecutor") public ThreadPoolTaskExecutor cameraPTZExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(20); executor.setMaxPoolSize(50); executor.setQueueCapacity(200); executor.setKeepAliveSeconds(60); executor.setThreadNamePrefix("camera-ptz-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } /** * SDK调用线程池(防止SDK卡死拖垮主线程池) */ @Bean("timeoutExecutor") public ThreadPoolTaskExecutor timeoutExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(50); executor.setMaxPoolSize(100); executor.setQueueCapacity(500); executor.setKeepAliveSeconds(60); executor.setThreadNamePrefix("camera-timeout-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); executor.initialize(); return executor; } /** * WebSocket推送线程池(避免慢客户端阻塞调度线程) * DiscardOldestPolicy: 推送任务允许丢弃旧消息以保证实时性 */ @Bean("wsPushExecutor") public ThreadPoolTaskExecutor wsPushExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(4); executor.setMaxPoolSize(16); executor.setQueueCapacity(2000); executor.setKeepAliveSeconds(60); executor.setThreadNamePrefix("ws-push-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy()); executor.initialize(); return executor; } }