开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot):项目中整合定时任务】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/667/detail/11508
项目中整合定时任务
目录:
一,什么是定时任务
二,如何实现定时任务
一,什么是定时任务
定时任务的说的官方点就是你可以在特定时间让你的程序自动去执行。
在现实生活中的例子:闹钟,闹钟在每天一个固定时间都会响。
这就是一个定时任务,比如每天早上我设置在早晨6点闹钟响,那每天早晨6点闹钟就会自动响起,这个就叫定时任务,是一个典型场景,而现在程序中也可以用定时任务,程序中定时任务有什么场景,如我要去生成数据,要手动去选择日期,点生成才可以做到。
即我们需要手动操作,这个操作确实没有问题。但实际中这种功能一般我们不喜欢手动操作,更喜欢自动完成,比如现在有个规则,每天凌晨1点把前一天数据自动执行。
统计到统计表中,让这个过程自动实现,而不需要每次手动。这就是定时任务。用定时任务方式不写页面,每天都自动操作,这就是它的一个场景。刚才的过程,通过程序完全自动化,接口自动化,加到表中。这就是一个场景,叫定时任务,像一个闹钟,就是一个典型的时间用场景。
二,如何实现定时任务
因为现在用的是,它在整个定时任务是特别方便的,定时任务该怎么去使用:
定时任务:在固定时间自动执行程序,不需要手动执行操作,能自动执行。
比如说我们现实生活中闹钟就是一个典型的任务场景。每天固定时间响起,我们可以让程序在每天固定时间操作比如生成数据功能,让它在每天凌晨一点把前一天的数据做统计。这就叫定时任务。用可以自动更方便的整合定时任务。
实现步骤:
1.在项目启动类添加注解
进入 statistics 模块,找到启动类 StaApplication,添加注解:@EnableScheduling 表示开始定时任务。
2. 创建定时类,在这个类里面使用表达式设置什么时候去执行
(1)cron 表达式用于设置什么时候执行或表达的规则。
创建类,类名随便写:添加一个包 schedule,在包里创建类,类名为 ScheduledTask,在类上方添加注解:@Component。
创建方法代码:
public class ScheduledTask {
//“0/5* * * * ?”表示每隔5秒钟执行一次这个方法
@Scheduled(cron = “0/5* * * * ?”)
//固定写法,cron 表达示能制定什么时候执行
public void task1() {
System.out.println(“******task1执行了。。。”);
}
}
完成了,当启动程序时,会按照“0/5* * * * ?”表达示的规则去执行方法,也可以调接口。
演示一下,看效果。
进一步解释“0/5* * * * ?”表达示到底什么含义,该怎么去写。
启动后,如果正确,规则就会生效每隔5秒钟执行一次方法,task1执行后等待5秒又执行了一次,5秒后又执行一次,每隔5秒都会执行一次方法。
可以修改表达式把间隔时间设置长一些,如每天凌晨一点,每天12点执行,该规则都会做到。
cron 表达式设置执行规则,也成为七子表达式,也叫七域表达式。它不需要写,在网络上有针对这种表达式的生成工具,可以搜索在线生成 cron 表达式,如:http://cron.qqe2.com/
有的工具不好用时可以换其他工具。秒,分钟,小时,日,月,周,年有七种,所以叫七子表达式。
有7个组成部分,表达式分别对应不同部分。
年一般不指定,默认当前年份;周指星期一到星期天,月指1到12月,日指1到31号,小时指0到23时,有上午下午,上午指0到11时,下午指12到23时。
分钟指0到59分钟;秒指0到59秒,这是它的七个部分。
举例:
(1)“0/5* * * * ?”表示每隔5秒钟执行一次
在工具里秒的部分,选择从0秒开始,每5秒执行一次,这就是每隔5秒执行一次,下方生成了 cron 表达式“0/5* * * * ?”,与代码中表达式一致。该表达式有6位,可以再加1位。0/5* * * * * ?也可以。但是在代码中只能写6位,写7位会报错,它默认年为当前年。
添加一位成7位,表达式是对的。在整合时会报错。
(2)每天凌晨一点执行一次
每次工具下方都有执行过程包括执行时间。找小时,选择上午01时,生成 cron 表达式为:001**?*下方最近5次运行时间;15号1点,16号1点,17号一点等。
其他表达式用工具生成也一样,使用工具,选择想要的效果,自动生成。整合时仍然是6位,第7位不写。?表示任意。
修改代码;
public class ScheduledTask {
@Autowried
private StatisticsDailyService staService;
//“0/5* * * * ?”表示每隔5秒钟执行一次这个方法
@Scheduled(cron = “0/5* * * * ?”)
//固定写法,cron 表达示能制定什么时候执行
public void task1() {
System.out.println(“******task1执行了。。。”);
}
//在每天凌晨1点,把前一天数据进行查询添加,如3月9号把3月8号的数据查询添加。
@Scheduled(cron = “001* * ?”)
public void task2() {
System.out.println(“******task2执行了。。。”);
staService.registerCount():
//调用方法
}
}
工具类 DataUtil.java,把它直接复制到新建的类 utils 中,该工具类可以取到日期。
调用 formatDate 方法得到当前日期,调用 addDays 方法调用前一天的日期。执行后看两个方法输出什么值,用在项目中。
值为当前日期3月14号,前一天日期3月13号,在每天凌晨1点,把前一天数据进行查询添加,调用 addDays 方法即可。
@Scheduled(cron = “001* * ?”)
public void task2() {
staService.registerCount(DataUtil.formatData(DataUtil.addDays(new Data(),-1):
//调用方法
}
程序执行后会每天凌晨一点自动执行方法,查询添加前一天的数据。
通过代码主要掌握定时任务怎么整合,表达式怎么写即表达式的特点。定时任务在日常中很常见。