springboot项目中实现定时任务+异步任务
1 步骤一 启动类上开启任务调度
在了解了定时任务和异步任务后,常见的使用场景是定时执行发邮件的操作
首先要在springboot项目的启动类上使用注解@EnableScheduling开启任务调度
2 步骤二 定义类 设置要定时+异步实现的任务
注意几点
①整个类要用@Component交给spring容器管理
②使用@Scheduled实现了定时执行方法,用的是cron表达式,其中涉及的两个属性说明如下
语法 |
说明 |
fixedDelay |
延迟时间。表示定时在务执行时的延时时间。这个延时时间表示的是第一次在务结束到第二次任务开始的时间 |
fixedRate |
间隔时间。表示下次在务执行开始的时间间隔。这个时间间隔表示的是第一次开始执行的事件到第二次开始执行时间的间隔,不管第一次任务是否执行完SpringTask是执行的只有一个线程在执行 |
③方法中的代码调用自定义的AsyncManager类,传入自定义的AsyncFactory类中定义好的方法,实现异步任务,具体代码见java实现异步任务 AsyncManager AsyncFactory
AsyncFactory类中定义好的方法是发送邮件
代码:
MyTask这个类下可以写多个方法,每个方法用@Scheduled设置定时,每个方法中通过使用AsyncManager类和AsyncFactory类实现异步执行AsyncFactory类中定义的方法
@Component
public class MyTask {
//使用@Scheduled实现定时
@Scheduled(cron = "0/5 * * * * *",fixedRate = 5000,fixedDelay = 5000)
public void sendEmail(){
//调用自定义的AsyncManager类(执行器)执行AsyncFactory类中定义的任务(发送邮件)
AsyncManager.getInstance().execute(AsyncFactory.sendEmail("xxx@qq.com","xxxxxx"));
}
}
3 设置两个线程池
定时任务有自己的线程池,在yml中的设置如下
spring:
task:
scheduling:
pool:
size: 20
异步任务也有自己的线程池,在yml中的设置如下
task:
execution:
pool:
core-size: 50