定时任务概述:
任务调度:
是指系统为了自动完成特定任务,在约定的特定时刻执行任务的过程。有了任务调度,即可解放更多的人力,而是由系统自动去执行任务。
常用业务场景案例:
- 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。
- 某银行系统需要在信用卡到期还款日的前三天进行短信提醒。
- 某财务系统需要在每天凌晨0:10结算前一天的财务数据,统计汇总。
- 12306会根据车次的不同,设置某几个时间点进行分批放票。
如何实现任务调度?
多线程方式,结合sleep
JDK提供的API,例如:Timer、ScheduledExecutor
框架,例如Quartz ,它是一个功能强大的任务调度框架,可以满足更多更复杂的调度需求
spring task
cron表达书:
- cron表达式是一个字符串,用来设置定时规则,由7个部分组成,每部分中间用空格隔开。
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 |
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 0 11 * * ? 每天11点运行一次
0 0 1 6 * ? 每月6号凌晨1点执行一次
0 0 23 L* ? 每月最后一天23点运行一次
0 28,32,47 * * * ?在 28分,32分,33分运行一次
0 0/30 9-17 * * ? 朝九晚五工作时间内,每半小时运行一次任务
0 15 10 ? * 6#3 每月的第三个星期五上午,10:15运行一次任务
Spring Task入门案例:
1). 导入maven坐标 spring-context 目前项目中只要导入了springboot相关依赖会自动导入,这一步无需操作
2).自定义定时任务类
定义一个定时任务类:
在com.sde包下:新建一个job包,里面新建一个MyTaskOne任务类
@Slf4j
@Component
public class MyTaskOne {}
编写一个测试方法,每隔5秒执行一次。
代码:
@Slf4j
@Component
public class MyTaskOne {@DisplayName(value = "每隔5秒执行一次")@Scheduled(cron = "0/5 * * * * ?")void test1(){LocalDateTime now = LocalDateTime.now();System.out.println(now);}
}
记得要在我们的spring boot 启动类上,加一个注解:@EnableScheduling
@SpringBootApplication
@EnableScheduling
public class ZzylApplication {public static void main(String[] args) {SpringApplication.run(ZzylApplication.class, args);}
}
效果: