Springboot @Async不执行原因分析

这篇博客探讨了在Spring Boot中使用@Async注解进行异步任务处理时遇到的问题。当默认线程池被耗尽,可能导致任务无法执行。解决方案包括调整业务代码、自定义线程池和优化异步方法的调用方式。同时,提到了@Async失效的可能原因,如缺少@EnableAsync注解、方法权限和调用方式等,并提供了相应的解决建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

项目中有一个异步方法运行一段时间后就不再执行了。该异步方法是使用@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.

  1. ThreadPoolTaskExecutor的默认参数是由TaskExecutionProperties控制的。默认核心线程是8,线程prefix是 “task-”。 搜索线程dump,有8个异步任务已经耗尽了线程池,且执行没有停止的迹象。

构造默认线程池方法
org.springframework.boot.task.TaskExecutorBuilder#configure
在这里插入图片描述

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

  2. 一方面要调整业务代码,使用默认线程池;另一方面也可以暂时增加默认线程池大小缓解
    在这里插入图片描述

@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) 如果需要从类的内部调用,需要先获取其代理类。
@Async注解是用来表示方法是异步执行的。在引用中的代码示例中,@Async注解用于表示MyTask类中的两个方法doing()和doing2()是异步执行的。这意味着这两个方法将在后台线程中执行,而会阻塞主线程的执行。这样可以在执行方法时延迟一段时间再执行,从而实现延迟执行的效果。例如,在doing()方法中,使用了@Scheduled注解设置了初始延迟1秒以及每隔3秒执行一次,而在doing2()方法中,使用了@Scheduled注解设置了初始延迟1秒以及每隔6秒执行一次。这样,可以实现方法的延迟执行功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [async延时函数](https://blog.youkuaiyun.com/weixin_51042892/article/details/123339420)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_blog_pc_vip","utm_medium":""}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [springboot2 定时任务:同步 异步 多线程 延迟执行,cron详解](https://blog.youkuaiyun.com/m0_37202351/article/details/82763303)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_blog_pc_vip","utm_medium":""}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [js的延迟执行问题分析](https://download.youkuaiyun.com/download/weixin_38560797/14822900)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_blog_pc_vip","utm_medium":""}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值