赞
踩
有时候,在开发中会需要使用到一些需要定时执行的任务。
在使用SpringBoot开发时,使用@Schedule就能非常容易的实现相对比较简单的定时任务。
对于更加复杂的定时任务,可以使用 Quartz、elastic-job等开源第三方定时任务框架,适合分布式项目应用。
首先,要使用SpringBoot提供的定时任务功能,需要在SpringBoot启动类上添加一个注解:@EnableScheduling
。该注解的作用是启用 Spring 的定时任务执行能力。
如下所示:
@EnableScheduling
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
编写定时任务类和方法。
定时任务类需要在类上加上@Component
注解,这样Spring会把这个Bean放到IoC容器中管理。
定时任务方法上,需要加上@Sheduled
注解,这个注解标记一个要被调度的方法。该注解还必须指定 cron、fixedDelay 或 fixedRate 属性之一。
@Component
public class ScheduledTask {
// 此处定义了该任务将每隔3秒执行一次
@Scheduled(fixedRate = 3000)
public void scheduledTask() {
System.out.println("定时任务开始执行,时间:" + DateUtils.dateFormat());
// 执行业务代码
}
}
关于cron、fixedDelay 或 fixedRate 属性:
fixedRate:
如果业务代码执行时间小于定时任务间隔时间,那么定时任务每3秒执行一次,且不受业务代码影响,无论业务代码执行多久,定时任务都是3秒执行一次;
但如果业务代码执行时间大于定时任务间隔时间,则定时任务循环执行。也就是说,如果业务代码执行花了5秒,那么5秒过后,会马上开始新一轮定时任务,不断这样循环执行。
fixedDelay:
这个属性在源码的解释翻译是:在最后一次调用结束和下一次调用开始之间的固定时间段后执行带注释的方法。
也就是说:即使业务代码执行时间比定时任务指定执行时间更长,定时任务都会等业务代码执行完成后重新再开启新一轮定时。
cron:
此属性通过 cron
表达式定义规则。比如有这样的表达式0 0/30 9-17 * * ?
,这表达式表示:朝九晚五工作时间内每半小时执行一次指定的定时任务。
这个cron
属性非常灵活强大,可以在网上找到很多示例,这里就不展开了。
启动SpringBoot项目,可以看到如下日志输出:
...
执行定时任务,时间:2022-04-27 22:50:30
执行定时任务,时间:2022-04-27 22:50:33
执行定时任务,时间:2022-04-27 22:50:36
执行定时任务,时间:2022-04-27 22:50:39
执行定时任务,时间:2022-04-27 22:50:42
可以看到,每次执行定时任务的间隔时间都是在3秒。
使用SpringBoot给我们提供的这几个注解,就可以很方便的实现简单类型的定时任务。
以上只是一个非常简单的示例,在实际开发中,还需要考虑多个线程同时执行定时任务的问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。