一、定时任务的实现方式
(1)Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。
(2)使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。
(3) Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。
二、编写scheduler类,给定时任务类MyTask添加注解@Configuration和@EnableScheduling
@Configuration
@EnableScheduling
public class MyTask {
//每10秒钟执行一次
@Scheduled(cron = "0/10 * * * * *")
public void task1(){
System.out.println("this is my task1" +new Date());
}
//每1分钟执行一次
@Scheduled(cron = "0 0/1 * * * *")
public void task2(){
System.out.println("this is my task2"+new Date());
}
}
运行application,可以看到控制台中不断输出的定时任务执行的信息。
this is my task1Sat Jun 10 17:56:40 CST 2017
this is my task1Sat Jun 10 17:56:50 CST 2017
this is my task2Sat Jun 10 17:57:00 CST 2017
this is my task1Sat Jun 10 17:57:00 CST 2017
this is my task1Sat Jun 10 17:57:10 CST 2017
this is my task1Sat Jun 10 17:57:20 CST 2017
this is my task1Sat Jun 10 17:57:30 CST 2017
this is my task1Sat Jun 10 17:57:40 CST 2017
this is my task1Sat Jun 10 17:57:50 CST 2017
this is my task1Sat Jun 10 17:58:00 CST 2017
this is my task2Sat Jun 10 17:58:00 CST 2017
this is my task1Sat Jun 10 17:58:10 CST 2017
this is my task1Sat Jun 10 17:58:20 CST 2017
this is my task1Sat Jun 10 17:58:30 CST 2017
三、cronExpression配置说明和cron栗子
字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /
- 区间
* 通配符
? 你不想设置那个字段
CRON表达式 含义
"0 0 12 * * ?" 每天中午十二点触发
"0 15 10 ? * *" 每天早上10:15触发
"0 15 10 * * ?" 每天早上10:15触发
"0 15 10 * * ? *" 每天早上10:15触发
"0 15 10 * * ? 2005" 2005年的每天早上10:15触发
“0 * 14 * * ?" 每天从下午2点开始到2点59分每分钟一次触发
"0 0/5 14 * * ?" 每天从下午2点开始到2:55分结束每5分钟一次触发
"0 0/5 14,18 * * ?" 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发
"0 0-5 14 * * ?" 每天14:00至14:05每分钟一次触发
"0 10,44 14 ? 3 WED" 三月的每周三的14:10和14:44触发
"0 15 10 ? * MON-FRI" 每个周一、周二、周三、周四、周五的10:15触发