SpringBoot项目中@Async方法没有执行的问题分析

深碍√TFBOYSˉ_ 2022-12-01 03:55 289阅读 0赞

现象:

  1. 1. 表面现象: 方法中输出的日志, 日志文件中找不到, 也没有任何报错(即@Async标注的方法没有执行, 也没有报错)
  2. 2. 分析现象: 日志中某个时刻之后没有了task-xxx线程的日志

原因:

  1. @Async异步方法默认使用Spring创建ThreadPoolTaskExecutor(参考TaskExecutionAutoConfiguration),

其中默认核心线程数为8, 默认最大队列和默认最大线程数都是Integer.MAX_VALUE. 创建新线程的条件是队列填满时, 而

这样的配置队列永远不会填满, 如果有@Async注解标注的方法长期占用线程(比如HTTP长连接等待获取结果),

在核心8个线程数占用满了之后, 新的调用就会进入队列, 外部表现为没有执行.

Spring **已经实现的线程池**

  1. SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,默认每次调用都会创建一个新的线程。
  2. SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作。只适用于不需要多线程的地方。
  3. ConcurrentTaskExecutor:Executor的适配类,不推荐使用。如果ThreadPoolTaskExecutor不满足要求时,才用考虑使用这个类。
  4. SimpleThreadPoolTaskExecutor:是Quartz的SimpleThreadPool的类。线程池同时被quartz和非quartz使用,才需要使用此类。
  5. ThreadPoolTaskExecutor :最常使用,推荐。 其实质是对java.util.concurrent.ThreadPoolExecutor的包装。

异步的方法有:

  1. 最简单的异步调用,返回值为void
  2. 带参数的异步调用,异步方法可以传入参数
  3. 存在返回值,常调用返回Future
  1. package application.service.schedule;
  2. import org.springframework.aop.interceptor.AsyncExecutionAspectSupport;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.scheduling.annotation.EnableAsync;
  6. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
  7. import java.util.concurrent.Executor;
  8. import java.util.concurrent.ThreadPoolExecutor;
  9. /**
  10. * @author wtl
  11. */
  12. @EnableAsync
  13. @Configuration
  14. public class ScheduleTaskPoolConfig {
  15. @Bean(name = AsyncExecutionAspectSupport.DEFAULT_TASK_EXECUTOR_BEAN_NAME)
  16. public Executor taskExecutor() {
  17. ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  18. //核心线程池大小
  19. executor.setCorePoolSize(100);
  20. //最大线程数
  21. executor.setMaxPoolSize(200);
  22. //队列容量
  23. executor.setQueueCapacity(0);
  24. //活跃时间
  25. executor.setKeepAliveSeconds(60);
  26. //线程名字前缀
  27. executor.setThreadNamePrefix("taskExecutor-");
  28. executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
  29. return executor;
  30. }
  31. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d0bDE5OTI_size_16_color_FFFFFF_t_70

发表评论

表情:
评论列表 (有 0 条评论,289人围观)

还没有评论,来说两句吧...

相关阅读