VirtualThreadConfig.java 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package com.aitori.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.core.task.AsyncTaskExecutor;
  5. import org.springframework.core.task.support.TaskExecutorAdapter;
  6. import org.springframework.scheduling.annotation.EnableAsync;
  7. import org.springframework.scheduling.annotation.EnableScheduling;
  8. import org.springframework.scheduling.annotation.SchedulingConfigurer;
  9. import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
  10. import org.springframework.scheduling.config.ScheduledTaskRegistrar;
  11. import java.util.concurrent.Executors;
  12. import java.util.concurrent.ThreadFactory;
  13. /**
  14. * 适配定时任务+异步任务全场景
  15. */
  16. @Configuration
  17. @EnableAsync
  18. @EnableScheduling // 开启定时任务
  19. public class VirtualThreadConfig implements SchedulingConfigurer {
  20. /**
  21. * 1. 全局异步任务执行器(虚拟线程)
  22. * 异步任务执行器(@Async 注解会使用这个虚拟线程执行器)
  23. */
  24. @Bean
  25. public AsyncTaskExecutor asyncTaskExecutor() {
  26. // 虚拟线程池:每个任务创建一个虚拟线程
  27. return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());
  28. }
  29. /**
  30. * 2. 定时任务调度器(绑定虚拟线程工厂)
  31. */
  32. @Bean
  33. public ThreadPoolTaskScheduler taskScheduler() {
  34. ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
  35. // 虚拟线程无实际池大小限制,此值仅为适配Spring接口(可设1)
  36. scheduler.setPoolSize(1);
  37. scheduler.setThreadNamePrefix("scheduled-virtual-thread-");
  38. // 关键修正:直接创建虚拟线程工厂(无需依赖ExecutorService的方法)
  39. ThreadFactory virtualThreadFactory = Thread.ofVirtual().name("scheduled-", 1).factory();
  40. scheduler.setThreadFactory(virtualThreadFactory);
  41. scheduler.initialize();
  42. return scheduler;
  43. }
  44. /**
  45. * 3. 绑定定时任务到虚拟线程调度器
  46. */
  47. @Override
  48. public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
  49. taskRegistrar.setTaskScheduler(taskScheduler());
  50. }
  51. }