如果会Cron表达式可以直接转至第二个标题的快速入门
,两步学会,极速上手
SpringTask是Spring框架中提供的一个基于注解的任务调度框架。它提供了@Scheduled注解,可以按照约定的时间自动执行某个代码逻辑
作用是什么?
定时执行java代码
使用场景, 比如我们每个月的会员到期提醒, 信用卡还款通知,还有当我们过生日的时候软件都会祝贺我们等这些都是应用的场景
我们常见的定时任务框架还有Quartz、Elastic-Job、XXL-JOB、PowerJob等
这里选择使用SpringTask主要是因为他是Spring框架实现的
在使用之前我们还需要知道的是 —> 如何让程序知道我们的 定时规则?
如果有Linux基础会知道在Linux中也有定时任务的功能,他使用的方法是使用 cron表达式,其实这里也一样,甚至其他的类似的定时框架都是如此,沿用Linux中的 Cron表达式,所以学会这个就是血赚,一次学习处处使用。哈哈很香,下面先学习Cron表达式吧。
1,cron表达式
cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间
构成规则: 分为6或7个域,由空格分隔开,每个域代表一个含义:秒、分钟、小时、日、月、周、年(可选),每部分的含义如下表所示:
也就是通过这七个域,就可以表达出你所有的定时任务的需求
组成部分 | 含义 | 取值范围 |
---|---|---|
第一部分 | Seconds (秒) | 0-59 |
第二部分 | Minutes(分) | 0-59 |
第三部分 | Hours(时) | 0-23 |
第四部分 | Day-of-Month(天) | 1-31 |
第五部分 | Month(月) | 0-11或JAN-DEC |
第六部分 | Day-of-Week(星期) | 1-7(1表示星期日)或SUN-SAT |
第七部分 | Year(年) 可选 | 1970-2099 |
通过上面的简单的介绍可能你就知道,构成规则 为啥写的是分为6或7个了 ,因为第七部分是可以省略的,不写就是每年。
在这里需要注意的是 星期和月份,
星期:按照国外的习惯,习惯把 周日认为是一周的开始, 所以周日是1 其他的依次往后延续
月份: 月份是从0开始,也可以是月份的缩写
另外, cron表达式还可以包含一些特殊符号来设置更加灵活的定时规则, 如下表所示:
符号 | 含义 |
---|---|
? | 表示不确定的值。当两个子表达式其中一个被指定了值以后,为了避免冲突,需要将另外一个的值设为“?”。例如:想在每月20日触发调度,不管20号是星期几,只能用如下写法:0 0 0 20 * ?,其中最后以为只能用“?” |
* | 代表所有可能的值 |
, | 设置多个值,例如”26,29,33”表示在26分,29分和33分各自运行一次任务 |
- | 设置取值范围,例如”5-20”,表示从5分到20分钟每分钟运行一次任务 |
/ | 设置频率或间隔,如"1/15"表示从1分开始,每隔15分钟运行一次任务 |
L | 用于每月,或每周,表示每月的最后一天,或每个月的最后星期几,例如"6L"表示"每月的最后一个星期五" |
W | 表示离给定日期最近的工作日,例如"15W"放在每月(day-of-month)上表示"离本月15日最近的工作日" |
# | 表示该月第几个周X。例如”6#3”表示该月第3个周五 |
我们一般常用的是前五个
说明:一般日和周的值不同时设置,其中一个设置,另一个用?表示。
示例如下:
*/5 * * * * ? 每隔5秒执行一次
0 */1 * * * ? 每隔1分钟执行一次
0 0 5-15 * * ? 每天5-15点整点触发
0 0/3 * * * ? 每三分钟触发一次
0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
当然如果不想手写也可以在三方网站上通过设置具体的信息,来自动生成cron表达式
cron表达式在线生成器:https://cron.qqe2.com/
2、快速入门
第一步:(省略)
导入坐标,如果是SpringBoot项目,在SpringBoot-starter中的Spring-context包中已经存在了所以我们只需要导入起步依赖即可(默认拥有),如果不是可以自行查找jar包
第二步:
在启动类上添加注解@EnableScheduling
注解
@SpringBootApplication
@EnableScheduling
public class SkyApplication {
.......
}
第三步:
定义一个任务类: 注意一般来说一个任务类只有一个对应任务的方法
在方法上使用@Scheduled( )注解
@Scheduled(cron = “cron 表达式”)
@Component // 放入IOC容器
public class TestTask {
@PostConstruct
@Scheduled(cron = "0 * * * * ?")
public void checkForOverdueOrders() {
// 需要执行的任务
System.out.println("hello")
}
}
此时启动SpringBoot项目,控制台就会每分钟打印一次 hello
在方法内写自己的业务代码即可。
@Scheduled()还有一个常用的参数
fixedRate:指定任务执行完成后,过多长时间再次执行。单位是ms
fixedRate = 5000 就是每五秒执行一次。即上面的每分钟执行一次就可以写作 fixedRate = 60000
加餐环节
另外如果需要也可以添上另外两个注解;先看需求
我想在当前对象初始化的时候就调用这个方法,该怎么办?
此时可以使用 @PostConstruct
@Component // 放入IOC容器
public class TestTask {
@PostConstruct
@Scheduled(cron = "0 * * * * ?")
public void checkForOverdueOrders() {
// 需要执行的任务
System.out.println("hello")
}
}
见名知意。也就是当当前类的对象一创建就执行这个任务。
另外一个是 @PreDestroy
也就是在当前对象销毁之前执行的方法
可以用来释放资源。
@PreDestroy
public void clean(){
}