一、cron表达式概述
cron表达式是一种用来配置计划任务的字符串表达式,由6个字段组成,每个字段描述了计划任务中的一个时间段,分别表示分钟、小时、日、月、周、年。一个cron表达式的格式如下:
* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ │
│ │ │ │ │ └ year (optional)
│ │ │ │ └───── day of week (0 - 6) (Sunday to Saturday)
│ │ │ └────────── month (1 - 12)
│ │ └─────────────── day of month (1 - 31)
│ └──────────────────── hour (0 - 23)
└───────────────────────── minute (0 - 59)
如上所示,cron表达式有6个字段,每个字段用空格来分隔。每个字段都有它自己的符号来表示它所代表的时间段,由于cron表达式中允许使用的值及符号较多,因此需要对每个字段进行详细解析。
二、cron表达式字段详解
1.分钟字段
分钟字段可以设置0-59的任何值,或者使用特殊字符。特殊字符可以是:
*
: 匹配任意值,表示每分钟都匹配,
: 分隔符,可以指定多个值,例如:1,5,10表示在第1、5、10分钟执行-
: 范围符,可以指定一个范围内的值,例如:5-15表示在第5到15分钟之间执行/
: 步长符,可以指定一个初始值,后面每隔一定时间执行一次,例如:0/15表示从0分钟开始,每隔15分钟执行一次
例如:*/5 * * * * *
表示在每5分钟时执行一次任务。
2.小时字段
小时字段可以设置0-23的任何值,也可以使用特殊字符。特殊字符有和分钟字段一样的4种,用法也相同。例如:0 1-5 * * * *
表示在早上1到5点之间每分钟执行一次任务。
3.日字段
日字段可以设置1-31的任何值,也可以使用特殊字符。特殊字符有:*
、,
、-
、/
和 ?
,其中?
表示不指定,只能在日和周字段中使用。例如:0 0 10 1-15 * *
表示在每个月的1-15日的10点执行任务。
4.月字段
月字段可以设置1-12的任何值,也可以使用特殊字符。特殊字符有:*
、,
、-
、/
以及 JAN-DEC
十二个英文单词。例如:0 0 0 1 JAN,FEB,MAR * *
表示在每年的1月、2月、3月第一天的0点0分执行任务。
5.周字段
周字段可以设置0-7(0和7表示周日),可以使用0或7,也可以使用特殊字符。特殊字符有:*
、,
、-
、/
、L
、#
以及 MON-SUN
七个英文单词。例如:0 0 0 * * 1-5
表示在周一到周五的0点0分执行任务。
6.年字段
年字段可以设置1970年到2099年的任何值,可以使用4位数字表示年,也可以使用特殊字符。特殊字符有:*
、,
、-
、/
,例如:0 0 0 1 1 *
表示每年1月1日0点0分执行任务。
三、cron表达式的Java实现
在Java中,可以使用Quartz框架来处理cron表达式,主要涉及到两个类:
CronTriggerImpl
:用于配置和管理计划任务的触发条件,其中包括cron表达式等信息;SimpleTriggerImpl
:用于在特定的时间触发任务。
以下是一个示例,其中定义了一个在每天12:30执行的任务:
public class CronTriggerExample {
public static void main(String[] args) {
JobDetail jobDetail = newJob(MyJob.class).withIdentity("myJob").build();
CronTrigger cronTrigger = newTrigger().withIdentity("myCronTrigger")
.withSchedule(cronSchedule("0 30 12 * * ?"))
.build();
StdSchedulerFactory factory = new StdSchedulerFactory();
try {
Scheduler scheduler = factory.getScheduler();
scheduler.scheduleJob(jobDetail, cronTrigger);
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
其中MyJob
类是需要执行的任务类,需要实现Job
接口:
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Hello, world!");
}
}
这段代码实现了在每天12:30执行任务MyJob
,使用StdSchedulerFactory
获取一个scheduler实例,然后将jobDetail和cronTrigger进行关联后启动。
四、总结
cron表达式是一种用来配置计划任务的字符串表达式,由6个字段组成,每个字段描述了计划任务中的一个时间段。在Java中可以使用Quartz框架来处理cron表达式,使用CronTriggerImpl
和SimpleTriggerImpl
两个类来配置和管理任务的触发条件。