定时任务的实现方式
- Java自带的java.util.Timer类,这个类允许调度一个java.util.TimerTask任务,使用这种方式可以让你的程序按照某一个频率执行,但不能在指定时间运行,一般用的比较少。
- 使用Quartz,这是一个功能比较强大的调度器,可以让你的程序在指定的时间执行,也可以按照某一个频率执行,但是配置起来比较复杂。
- Spring3.0以后自带的task,可以将其视为一个轻量级的Quartz,使用起来比Quartz简单许多。
Cron表达式
在使用定时任务时,必须掌握Cron表达式,Cron表达式至少有6个(也可以是7个)由空格分隔的时间元素组成.第7个元素可选的,从左至右,这些元素的定义如下表:
Cron表达式的每一个字段,都可以显式规定一个值(如49),一个范围(如1-6),一个列表(如1,3,5)或者一个通配符(如*)表示每一个值.有几个特殊的字符,具体说明一下:
● -: 中划线,表示一个范围
● ,:使用逗号间隔的数据,表示一个列表
● *:表示每一个值,它可以用于所有的字段,例如在小时字段表示每小时
● ?:该字符仅用于”月份的哪一天”字段和”星期几”字段,表示不指定值,当这两个字段其中之一被指定值之后,为了避免冲突,需要将另外一个字段的值设置为”?”
● /:通常表示为x/y,x为起始值,y表示值的增量,例如,在分钟字段中使用”0/15”,表示0,15,30,45
● L:表示”Last”,仅在”月份的哪一天”字段和”星期几”字段中使用,但是在这两个字段表示的含义不同,L在”月份的哪一天”字段中,表示一个月的最后一天. L在”星期几”字段中,表示一个月的最后一个星期.你可以用一个数字和L连用,表示一个月最后一个星期的星期几.比如表达式”0 0 0 ? * 2L”,”2L”表示的是每个月的最后一个星期的星期一触发
● #:只能用于”星期几”字段,表示这个月的第几个周几,例如”6#3”指的是这个月第3个星期五(6指星期五,3指第3个) : 星期天到星期六: 1-7
cron表达式示例:
Task
Quartz将其中的对象划分粒度过细,导致开发的时候有点繁琐,spring针对上述规则进行了简化,开发了自己的任务管理组件——Task
spring根据定时任务的特征,将定时任务的开发简化到了极致。怎么说呢?要做定时任务总要告诉容器有这功能吧,然后定时执行什么任务直接告诉对应的bean什么时间执行就行了,就这么简单,一起来看怎么做。
- 开启定时任务功能,在引导类上开启定时任务功能的开关,使用注解@EnableScheduling
@SpringBootApplication
//开启定时任务功能
@EnableScheduling
public class SpringbootTaskApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTaskApplication.class, args);
}
}
- 定义Bean,在对应要定时执行的操作上方,使用注解@Scheduled定义执行的时间,执行时间的描述方式还是cron表达式
@Component
public class MyTask {
//需要执行的任务 每十秒钟执行一次
//@Scheduled 定义定时任务的信息
// 属性 cron表达式:定义执行的时间
@Scheduled(cron="0/10 * * * * ?")
public void tesk1(){
System.out.println("tesk1.....["+new Date()+"]");
}
}
定时任务相关配置:
spring:
task:
scheduling:
pool:
size: 1 # 任务调度线程池大小 默认 1
# 调度线程名称前缀 默认 scheduling-
thread-name-prefix: suke_
shutdown:
#线程池关闭时等待所有任务完成
await-termination: false
# 调度线程关闭前最大等待时间,确保最后一定关闭
await-termination-period: 10s