文章目录
- 一、@Scheduled详解
- 二、逻辑实现
- 1、创建定时任务逻辑方法
- 2、新建一个启动执行类
- 三、测试结果
说到定时任务,我们应该会想起@Scheduled,Quartz以及XXL-JOB,但是有的单体服务或者小项目,为了方便快捷,可能会直接使用@Scheduled去实现异步任务。因此,从而延伸出本文的主题需求。
当项目中使用@Scheduled,如何在项目启动的时候让指定的异步任务提前执行一次?
一、@Scheduled详解
@Scheduled注解支持多个参数,用于灵活控制任务执行时间
- cron:Cron表达式,可以精准控制秒、分、小时、日、月、周等
- zone:接收一个时区,比如我们一般使用的时区Asia/Shanghai,该字段我们一般留空。
- fixedDelay:上一次执行完毕时间点之后多长时间再执行。如@Scheduled(fixedDelay = 5000)
- fixedDelayString:与 fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符,如@Scheduled(fixedDelayString = “5000”)
- fixedRate:上一次开始执行时间点之后多长时间再执行,如@Scheduled(fixedRate = 5000)
- fixedRateString:与 fixedRate 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。
- initialDelay:第一次延迟多长时间后再执行,如第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次@Scheduled(initialDelay=1000, fixedRate=5000)
- initialDelayString:与 initialDelayString 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。
二、逻辑实现
1、创建定时任务逻辑方法
/**
* @Author 码至终章
* @Version 1.0
*/
@Component
public class ScheduledTest {
@Scheduled(cron = "* 1 * * * ?")
public void task1() throws Exception{
System.out.println("task1 执行: " + Thread.currentThread() + "-" + DateTime.now());
}
}
2、新建一个启动执行类
该类主要在启动时手动调用指定的任务方法
/**
* @Author 码至终章
* @Version 1.0
*/
@Component
public class StartupTasks {
private final ScheduledTest scheduledTasks;
public StartupTasks(ScheduledTest scheduledTasks) {
this.scheduledTasks = scheduledTasks;
}
@PostConstruct
public void startUp() {
try {
System.out.println("服务启动执行任务");
scheduledTasks.task1();
}catch (Exception e){
e.printStackTrace();
}
}
}
注:启动类记得自己加上@EnableScheduling,定时任务 才会执行,当然这个不影响本文的逻辑测试
三、测试结果
服务启动后,查看打印信息