> 文章列表 > SpringTask定时任务(分钟学会)

SpringTask定时任务(分钟学会)

SpringTask定时任务(分钟学会)

如果会Cron表达式可以直接转至第二个标题的快速入门,两步学会,极速上手


SpringTask是Spring框架中提供的一个基于注解的任务调度框架。它提供了@Scheduled注解,可以按照约定的时间自动执行某个代码逻辑

作用是什么?

定时执行java代码

使用场景, 比如我们每个月的会员到期提醒, 信用卡还款通知,还有当我们过生日的时候软件都会祝贺我们等这些都是应用的场景

我们常见的定时任务框架还有QuartzElastic-JobXXL-JOBPowerJob

这里选择使用SpringTask主要是因为他是Spring框架实现的

在使用之前我们还需要知道的是 —> 如何让程序知道我们的 定时规则

如果有Linux基础会知道在Linux中也有定时任务的功能,他使用的方法是使用 cron表达式,其实这里也一样,甚至其他的类似的定时框架都是如此,沿用Linux中的 Cron表达式,所以学会这个就是血赚,一次学习处处使用。哈哈很香,下面先学习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(){}