欢迎光临散文网 会员登陆 & 注册

Springboot 异步任务使用

2022-06-22 11:21 作者:wulizhao1  | 我要投稿

1、在调用异步方法类上或者在启动类(有@SpringBootApplication的类)上增加注解:

@EnableAsync

2、在要开启异步任务的方法上增加注解:@Async

Spring默认线程池 SimpleAsyncTaskExecutor

Spring异步线程池的接口类是TaskExecutor,本质还是java.util.concurrent.Executor,没有配置的情况下,默认使用的是 SimpleAsyncTaskExecutor

注意点

关于注解失效需要注意以下几点

注解的方法必须是public方法

方法一定要从另一个类中调用,也就是从类的外部调用,类的内部调用是无效的,因为@Transactional和@Async注解的实现都是基于Spring的AOP,而AOP的实现是基于动态代理模式实现的。那么注解失效的原因就很明显了,有可能因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器。

异步方法使用注解@Async的返回值只能为void或者Future

解决办法:

如果要使同一个类中的方法之间调用也被拦截,需要使用spring容器中的实例对象,而不是使用默认的this,因为通过bean实例的调用才会被spring的aop拦截

本例使用方法:AsyncService asyncService = context.getBean(AsyncService.class); 然后使用这个引用调用本地的方法即可达到被拦截的目的。


为什么要使用自定义线程池

如果不自定义异步方法的线程池默认使用SimpleAsyncTaskExecutor。SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。并发大的时候会产生严重的性能问题。

拓展

内存溢出的三种类型

第一种OutOfMemoryError: PermGen space,发生这种问题的原因是程序中使用了大量的jar或class

第二种OutOfMemoryError: Java heap space,发生这种问题的原因是java虚拟机创建的对象太多

第三种OutOfMemoryError:unable to create new native thread,创建线程数量太多,占用内存过大

线程池拒绝策略

rejectedExectutionHandler参数字段用于配置绝策略,常用拒绝策略如下


AbortPolicy:用于被拒绝任务的处理程序,它将抛出RejectedExecutionException

CallerRunsPolicy:用于被拒绝任务的处理程序,它直接在execute方法的调用线程中运行被拒绝的任务。

DiscardOldestPolicy:用于被拒绝任务的处理程序,它放弃最旧的未处理请求,然后重试execute。

DiscardPolicy:用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。


Springboot 异步任务使用的评论 (共 条)

分享到微博请遵守国家法律