Quartz表达式:定时任务调度的实现
大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Quartz表达式,它是定时任务调度的一个强大工具,特别适用于需要灵活调度任务的场景。
1. Quartz表达式简介
Quartz是一款功能强大的开源作业调度框架,广泛应用于Java应用程序中进行定时任务调度。Quartz表达式(Cron表达式)是用来定义任务调度时间的规则,它可以设置任务在特定的时间、日期或周期内执行。
2. Quartz表达式的语法
Quartz表达式有六个字段,分别是秒、分钟、小时、日期、月份和星期。每个字段都可以包含特定的值和符号,用于指定任务的执行时间。
秒 分钟 小时 日期 月份 星期
* * * * * *
2.1 字段说明
- 秒(0-59): 任务执行的秒数。
- 分钟(0-59): 任务执行的分钟数。
- 小时(0-23): 任务执行的小时数。
- 日期(1-31): 任务执行的日期。
- 月份(1-12): 任务执行的月份。
- 星期(0-6): 任务执行的星期(0是星期天)。
2.2 常用符号
*
: 代表任何值。,
: 分隔多个值。-
: 表示范围。/
: 指定增量。L
: 表示最后一个(通常用于日期和星期字段)。W
: 表示最接近的工作日。#
: 表示每月第几个星期几。
3. Quartz表达式示例
3.1 每分钟执行一次
package cn.juwatech.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.JobBuilder;
import org.quartz.TriggerBuilder;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.JobKey;
import org.quartz.JobDataMap;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
public class MinuteJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Job executed at: " + new java.util.Date());
}
public static void main(String[] args) {
try {
SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
JobDetail jobDetail = JobBuilder.newJob(MinuteJob.class)
.withIdentity("minuteJob", "group1")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("minuteTrigger", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
.build();
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
3.2 每天凌晨1点执行
package cn.juwatech.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.JobBuilder;
import org.quartz.TriggerBuilder;
import org.quartz.CronScheduleBuilder;
public class DailyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Daily job executed at: " + new java.util.Date());
}
public static void main(String[] args) {
try {
SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
JobDetail jobDetail = JobBuilder.newJob(DailyJob.class)
.withIdentity("dailyJob", "group1")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("dailyTrigger", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 1 * * ?"))
.build();
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
3.3 每月的第一个工作日执行
package cn.juwatech.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.JobBuilder;
import org.quartz.TriggerBuilder;
import org.quartz.CronScheduleBuilder;
public class MonthlyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Monthly job executed at: " + new java.util.Date());
}
public static void main(String[] args) {
try {
SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
JobDetail jobDetail = JobBuilder.newJob(MonthlyJob.class)
.withIdentity("monthlyJob", "group1")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("monthlyTrigger", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 0 1W * ?"))
.build();
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
3.4 每周一和周四下午5点执行
package cn.juwatech.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.JobBuilder;
import org.quartz.TriggerBuilder;
import org.quartz.CronScheduleBuilder;
public class WeeklyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Weekly job executed at: " + new java.util.Date());
}
public static void main(String[] args) {
try {
SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
JobDetail jobDetail = JobBuilder.newJob(WeeklyJob.class)
.withIdentity("weeklyJob", "group1")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("weeklyTrigger", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 17 ? * MON,THU"))
.build();
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
4. Quartz调度器的配置
4.1 配置文件
Quartz的配置通常在quartz.properties
文件中完成,配置项包括线程池大小、调度程序属性等。以下是一个简单的配置示例:
# 定义线程池
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.scheduler.instanceName = MyScheduler
org.quartz.jobStore.misfireThreshold = 60000
# 设置线程池大小
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3
4.2 通过Java代码配置
Quartz的调度器也可以通过Java代码进行配置。这种方式允许程序在运行时动态配置调度任务。
package cn.juwatech.quartz;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.CronScheduleBuilder;
public class CustomScheduler {
public static void main(String[] args) {
try {
SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
JobDetail jobDetail = JobBuilder.newJob(MonthlyJob.class)
.withIdentity("customJob", "group1")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("customTrigger", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0
0 12 15 * ?"))
.build();
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
5. 总结
Quartz表达式为任务调度提供了灵活且强大的调度能力。通过掌握Quartz表达式的语法和应用实例,我们能够精确地控制任务的执行时间和频率,从而在复杂的系统中实现高效的任务调度。
本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!