Quartz Cron表达式
简介
Quartz是一个Java语言编写的开源任务调度框架,广泛应用于各种企业级应用程序中。在Quartz中,cron表达式被广泛使用,它可以用来定义任务调度的时间规则,让任务在指定的时间点或时间间隔内执行。
Cron表达式基础
cron表达式由7个子表达式组成,每个子表达式表示一个时间单位。这些时间单位按顺序分别是:秒、分钟、小时、日、月、星期、年。每个子表达式用空格分隔开。
以下是cron表达式的格式:
* * * * * * *
┬ ┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ │ │
│ │ │ │ │ │ └─ 年(可选,1970-2099)
│ │ │ │ │ └───── 星期(0-7)(0 或 7表示星期天)
│ │ │ │ └───────── 月(1-12)
│ │ │ └─────────── 日(1-31)
│ │ └───────────── 小时(0-23)
│ └─────────────── 分钟(0-59)
└───────────────── 秒(0-59)
表达式中的代表所有值,也就是说,对于一个子表达式,如果用来表示,那么它包含该时间单位内的所有值。比如,如果用*来表示小时,那么它就包含从0到23的所有小时。
除了*,还有些特殊字符,如:
- ?:只用于日和星期中的一个字段上,表示不指定值。如果?用于星期字段上,那么它等价于5表示星期五。
- -:用于表示一个范围。比如,1-3表示从1到3的三个数。
- ,:用于表示指定值。比如,1,3,5表示1、3、5这三个值。
- /:用于表示指定时间间隔。比如,2/5表示从第2个时间单位开始,每隔5个时间单位执行一次。比如,小时字段中的2/5表示从2小时开始,每5小时执行一次。
Cron表达式示例
下面是一些常用的cron表达式:
- 每秒钟执行一次:
* * * * * ? *
- 每分钟的第30秒执行一次:
30 * * * * ? *
- 每小时的第1分30秒执行一次:
30 1 * * * ? *
- 每天的14点整执行一次:
0 0 14 * * ? *
- 每月的第1天的14点整执行一次:
0 0 14 1 * ? *
- 每月最后一天的14点整执行一次:
0 0 14 L * ? *
- 每周一的14点整执行一次:
0 0 14 ? * MON *
- 每周一至周五的14点30分执行一次:
0 30 14 ? * MON-FRI *
- 每月的第一个星期五的14点整执行一次:
0 0 14 ? * 6#1 *
Cron表达式实现
下面是一个使用Quartz的示例代码,它使用cron表达式来配置任务的调度规则,让任务每5秒钟执行一次。需要注意的是,这个示例代码提供的类是一个独立的Java文件,它不需要使用Quartz的其它类或库。
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.*;
importimport org.quartz.impl.StdSchedulerFactory;
public class QuartzTest {
public static void main(String[] args) throws SchedulerException {
// 创建一个JobDetail实例,指定任务名称、任务组名称和任务类
JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
.withIdentity("myJob", "myJobGroup")
.build();
// 创建一个Cron表达式实例,指定执行规则
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
// 创建一个Trigger实例,指定触发器名称、触发器组名称和执行规则
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "myTriggerGroup")
.withSchedule(cronScheduleBuilder)
.build();
// 创建Scheduler实例,用于管理Job和Trigger
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
// 将Job和Trigger注册到Scheduler中
scheduler.scheduleJob(jobDetail, trigger);
// 启动Scheduler
scheduler.start();
}
public static class MyJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(new Date()) + " 执行了Quartz定时任务");
}
}
}
在这个示例代码中,我们创建了一个JobDetail和一个Trigger,并将它们注册到Scheduler中。其中,JobDetail指定了任务名称、任务组名称和任务类;Trigger指定了触发器名称、触发器组名称和执行规则。注意,这个示例代码使用了withIdentity()方法来指定Job和Trigger的名称和组别,这将用于Scheduler中的任务调度管理。
最后,我们创建了一个MyJob类,它实现了Quartz的Job接口,并在execute()方法中编写了任务的具体逻辑。这个任务将在指定的规则下执行。
结论
通过本文的介绍,我们了解了Quartz cron表达式的基础知识以及常用的几个示例。此外,我们也介绍了Quartz如何使用cron表达式来配置任务调度规则,并在示例代码中展示了Quartz的使用方法。通过学习本文的知识,在实际项目中,我们可以轻松使用Quartz框架提供的定时任务功能,实现各种任务的按时执行。