1.spring自带的定时器概述:
spring自带定时器实现有两种方式:①使用xml文件配置方式②使用注解方式
2.本文详解注解方式@Schedule 和 实现SchedulingConfigurer类
3.@Scheduled有三种定时任务的执行方式
- fixedDelay
- fixedRate
- corn
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表达式 } }