| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- 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());
- }
- }
|