基于springboot使用@Scheduled注解或实现SchedulingConfigurer类做定时调度

mac2024-05-17  28

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表达式 } }
最新回复(0)