1.spring自带的定时器概述:
spring自带定时器实现有两种方式:①使用xml文件配置方式②使用注解方式
2.本文详解注解方式@Schedule 和 实现SchedulingConfigurer类
3.@Scheduled有三种定时任务的执行方式
fixedDelayfixedRatecorn
fixedDelay:指定两次任务执行的时间间隔(毫秒),前一个任务结束与下一个任务开始的间隔
如:@Scheduled(fixedDelay = 5*1000 ),表示第一个任务执行结束,开始计时,过5秒后,开始第二次执行。
fixedRate:指定两次任务执行的时间间隔(毫秒),前一个任务开始与下一个任务开始的间隔。
如:@Scheduled(fixedRate= 5*1000 ),表示第一个任务开始执行,开始计时,过5秒后,开始第二次执行。
弊端:对于单线程任务来讲,如果执行时间大于间隔时间,会导致程序阻塞,依次类推,后面会接连发生阻塞。
corn:使用表达式执行任务(推荐使用)
cron一般是六个或七个字段,如下:
Seconds (秒)Minutes(分)Hours(小时)Day-of-Month (天)Month(月)Day-of-Week (周)Year(年)
4.在线生成corn表达式网址:http://cron.qqe2.com/
简单串行实现:
在springboot启动类加上注解:@EnableScheduling在自己定义的任务类加上注解:@Component在方法上加上注解: @Scheduled
@SpringBootApplication
@EnableScheduling
public class FirePatrolApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(FirePatrolApplication.class).run(args);
}
}
@Component
public class ValidityRemindTask {
private static final long SECOND = 1000;
// cron = "0 10 0 1/1 * ?" 每天00:10执行 -----0 0 1/1 * * ? 一小时执行一次测试用
@Scheduled(cron = "0 10 0 1/1 * ?")
public void testTask() {
// 根据业务写逻辑实现
}
}
异步调用,开启多线程(本方法可搭配fixedRate,避免线程阻塞)
在自己定义的任务类加上注解:@EnableAsync @Component在方法上加上注解: @Scheduled @Async
@Component
@EnableAsync
public class ValidityRemindTask {
private static final long SECOND = 1000;
// cron = "0 10 0 1/1 * ?" 每天00:10执行 -----0 0 1/1 * * ? 一小时执行一次测试用
@Scheduled(cron = "0 10 0 1/1 * ?")
@Async
public void testTask() {
// 根据业务写逻辑实现
}
}
SchedulingConfigurer实现使用
实现SchedulingConfigurer并重写configureTasks方法在启动类必须加上@EnableScheduling
@Component
public class ValidityRemindTask implements SchedulingConfigurer {
private static final long SECOND = 1000;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.addCronTask(new Runnable() {
@Override
public void run() {
// 根据业务逻辑具体实现
}
}, "0 0 1/1 * * ?"); //cron表达式
}
}