两种方式:Quartz和Task
Quartz
使用步骤:
1、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2、写任务,要求必须继承QuartzJobBean,重写的方法executeInternal()中就是你要定时执行的逻辑
public class DemoTask extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println("这是一个定时任务");
}
}
3、添加配置类,这里也是告诉springboot这是一个定时任务,同时还要把执行规则定义好
@Configuration
public class QuartzConfig {
//这里其实就是把任务包装一下
@Bean
public JobDetail jobDetail(){
return JobBuilder.newJob(DemoTask.class).storeDurably().build();
}
//这里要定义个调度器,也就是执行这个任务的时间规则,这个表达式是按具体的要求写的
//然后返回的这个是触发器,把上面的任务和下面的调度器组合到一起,这样springboot就知道要在什么时候执行什么任务了
@Bean
public Trigger trigger(){
ScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
return TriggerBuilder.newTrigger().forJob(jobDetail()).withSchedule(scheduleBuilder).build();
}
}
4、启动测试:
自己试吧
Task
这是spring自己开发的执行定时任务的功能,简单到你不会认为这是一个技术
1、在启动类上开启定时任务功能,加注解@EnableScheduling
@SpringBootApplication
@EnableScheduling
public class Springboot11TaskApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot11TaskApplication.class, args);
}
}
2、写任务,随便在一个bean里面写,只要在方法前加个注解@Scheduled(),括号里告诉他执行规则。只是要注意一下一定是要在bean里面写任务方法。
@Component
public class DemoTask {
@Scheduled(cron = "0/3 * * * * ?")
public void print(){
System.out.println("this is a task 。。。。。");
}
}
cron表达式规则:
其实定时任务这块的写法没什么问题,麻烦一点的是这个执行规则的cron表达式,这个是字符串,容易写错,需要特别注意一下。
随便拿来一个表达式:“0/3 * * * * ?”
总共是7部分,最后一个年可空,分别是:
”秒 分 时 日 月 周 年“
除了年,其他都不能为空
每一部分都有范围,比如分秒只能0-59,日只能1-31,周只能1-7,这个好理解
每一部分除了数字,还能写符号: * , - / ?
” * “ 表示每
在秒的位置,就是每秒,在日的位置就是每日,所以这个 * 不能出现在周的位置,你不能每周对吧,如果要指定周,一定要明确是每周几。
“,”表示和的意思
比如秒的位置 1,10,20 ,意思就是第1秒和第10秒和第20秒各触发一次,如果在月的位置上:2,3,6,就表示2月、3月、6月触发
“-”表示区间
2-5就表示从2到5,那么放在哪个单位上,就对应哪个单位的这段时间,比如日:3-8,那就是从3日到8日,也就是3、4、5、6、7、8这几天触发
“/"表示间隔
“/”前后各一个数字,表示从前一个数字开始,间隔后一个数字的时间触发,比如在秒的位置上,25/10,意思就是从第25秒开始,每10秒触发一次,也就是第25秒、第35秒、第45秒、第55秒各触发一次,等这一分钟完了,下一分钟再从第25秒开始。
“?”这个比较特殊,表示不设置的意思,
这个只能出现在周和日的位置上,因为这两个不能同时设置,否则就对不上就麻烦了。周的位置如果是?,表示不用考虑周,如果是数字,那就是每周几,同时如果周这个位置上写了数字,那么日那个位置上就要写?了,因为这两个不能同时指定
前面 ,-,/ 这几个也可以组合使用,但是估计一般很少有那种变态需求,碰到了就自己写一个试吧,平时不用记住了也会忘
举几个例子解释一下:
“0 0 13 * * ?” 每天13:00:00执行
“20 15 10 * * ?” 每天10:15:20执行
“0 35 13 * * ? 2022” 2022年每天13:35:00执行
“0 * 13 * * ?” 每天13点到14点每分钟0秒执行一次
“0 0/5 13 * * ?” 每天13点到14点每隔5分钟执行一次
“0 0/5 10,18 * * ?” 每天10点到11点,18点到19点,这两个时段内每隔5分钟执行一次
“0 0-5 14 * * ?” 每天14:00:00到14:05:00每分钟执行执行一次
更详细的规则可以参考:https://www.jianshu.com/p/e9ce1a7e1ed1