package com.aitori.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.core.task.support.TaskExecutorAdapter; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; /** * 适配定时任务+异步任务全场景 */ @Configuration @EnableAsync @EnableScheduling // 开启定时任务 public class VirtualThreadConfig implements SchedulingConfigurer { /** * 1. 全局异步任务执行器(虚拟线程) * 异步任务执行器(@Async 注解会使用这个虚拟线程执行器) */ @Bean public AsyncTaskExecutor asyncTaskExecutor() { // 虚拟线程池:每个任务创建一个虚拟线程 return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor()); } /** * 2. 定时任务调度器(绑定虚拟线程工厂) */ @Bean public ThreadPoolTaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); // 虚拟线程无实际池大小限制,此值仅为适配Spring接口(可设1) scheduler.setPoolSize(1); scheduler.setThreadNamePrefix("scheduled-virtual-thread-"); // 关键修正:直接创建虚拟线程工厂(无需依赖ExecutorService的方法) ThreadFactory virtualThreadFactory = Thread.ofVirtual().name("scheduled-", 1).factory(); scheduler.setThreadFactory(virtualThreadFactory); scheduler.initialize(); return scheduler; } /** * 3. 绑定定时任务到虚拟线程调度器 */ @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setTaskScheduler(taskScheduler()); } }