Springboot之@Async不执行原因及分析

 更新时间:2023年09月27日 09:39:44   作者:成明宁杰  
这篇文章主要介绍了Springboot之@Async不执行原因及分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

背景

项目中有一个异步方法允许一段时间后就不再执行了。该异步方法是使用@Async注解的。

分析原因

1.业务场景用了@Async注解的方法,且没有使用自定义线程池。

2.ThreadPoolTaskExecutor是springboot提供的默认线程池 。

也就是说如果没有自定义线程池,那么会自动装配这个默认的。

In the absence of an Executor bean in the context, Spring Boot auto-configures a ThreadPoolTaskExecutor with sensible defaults that can be automatically associated to asynchronous task execution (@EnableAsync) and Spring MVC asynchronous request processing.

3.ThreadPoolTaskExecutor的默认参数是由TaskExecutionProperties控制的。

默认核心线程是8,线程prefix是 “task-”。

搜索线程dump,有8个异步任务已经耗尽了线程池,且执行没有停止的迹象。

构造默认线程池方法

org.springframework.boot.task.TaskExecutorBuilder#configure 

4.如果该线程池被耗尽,则所有任务将会在线程池的队列中等待,而默认队列大小是Integer.MAX_VALUE

5.一方面要调整业务代码,使用默认线程池;另一方面也可以暂时增加默认线程池大小缓解

@Async使用总结

1、 非必须不使用异步。如果是核心业务包含事务处理,先同步记录数据,再异步发起。防止直接发起后异步没被调度到服务关闭,造成数据丢失

2、 核心业务必须使用自定义线程池,防止默认异步线程池阻塞,也方便通过线程池监控核心执行情况

3、 简单业务场景使用默认线程池时,避免操作长时间过长占用默认线程池,影响Spring以及别的框架组件异步任务执行

4、 @Async可能失效的原因    

  • a) @SpringBootApplication启动类当中没有添加@EnableAsync注解。    
  • b) 异步方法使用注解@Async的返回值只能为void或者Future。    
  • c) 没有走Spring的代理类。因为@Transactional和@Async注解的实现都是基于Spring的AOP,而AOP的实现是基于动态代理模式实现的。那么注解失效的原因就很明显了,有可能因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器管理。

@Async失效解决方法

  • a) 注解的方法必须是public方法。    
  • b) 注解的方法不要定义为static    
  • c) 方法一定要从另一个类中调用,也就是从类的外部调用,类的内部调用是无效的。    
  • d) 如果需要从类的内部调用,需要先获取其代理类。

如果该线程池被耗尽,则所有任务将会在线程池的队列中等待,而默认队列大小是Integer.MAX_VALUE

一方面要调整业务代码,使用默认线程池;另一方面也可以暂时增加默认线程池大小缓解

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JAVA遍历Map集合的几种方法汇总

    JAVA遍历Map集合的几种方法汇总

    这篇文章主要给大家介绍了关于JAVA遍历Map集合的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • MyBatis获取自动生成的(主)键值的方法

    MyBatis获取自动生成的(主)键值的方法

    本文主要介绍了MyBatis获取自动生成的(主)键值的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • java实现无符号数转换、字符串补齐、md5、uuid、随机数示例

    java实现无符号数转换、字符串补齐、md5、uuid、随机数示例

    这篇文章主要介绍了java实现无符号数转换、字符串补齐、md5、uuid、随机数示例,需要的朋友可以参考下
    2014-04-04
  • Java初学者入门之继承和多态

    Java初学者入门之继承和多态

    Java 面向对象编程有三大特性:封装、继承、多态,学好继承和多态是面向对象开发语言中非常重要的一个环节,这篇文章主要给大家介绍了关于Java初学者入门之继承和多态的相关资料,需要的朋友可以参考下
    2021-07-07
  • Spring事件监听机制观察者模式详解

    Spring事件监听机制观察者模式详解

    这篇文章主要为大家介绍了Spring事件监听机制观察者模式实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • java实现MapReduce对文件进行切分的示例代码

    java实现MapReduce对文件进行切分的示例代码

    本文主要介绍了java实现MapReduce对文件进行切分的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 如何给yml配置文件的密码加密(SpringBoot)

    如何给yml配置文件的密码加密(SpringBoot)

    这篇文章主要介绍了如何给yml配置文件的密码加密(SpringBoot),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 详解Java注解实现自己的ORM

    详解Java注解实现自己的ORM

    这篇文章主要介绍了Java注解实现自己的ORM知识,本文通过示例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-10-10
  • SpringBoot无法连接redis的解决方案

    SpringBoot无法连接redis的解决方案

    这篇文章主要介绍了SpringBoot无法连接redis的解决方案,文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-08-08
  • Spring Boot的无缝衔接实践案例

    Spring Boot的无缝衔接实践案例

    在快速迭代的软件开发环境中,无缝衔接是提升开发效率、降低维护成本、增强系统稳定性的关键,本文将深入解析Spring Boot无缝衔接的几大优势,并通过实际案例和深入分析,展示这些优势如何在项目中发挥作用
    2024-08-08

最新评论