Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce system.
Setup
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
Usage
客户端调用
JobDetail job = newJob(MyJob.class)
.withIdentity("myJob")
.build();
Trigger trigger = newTrigger()
.withIdentity(triggerKey("myTrigger", "myTriggerGroup"))
.withSchedule(simpleSchedule()
.withIntervalInHours(1)
.repeatForever())
.startAt(futureDate(10, MINUTES))
.build();
scheduler.scheduleJob(job, trigger);
Source Code
StdSchedulerFactory 是 Scheduler 的工厂方法,实现了 SchedulerFactory 接口。
// 提供客户端可用的 Scheduler
Scheduler getScheduler() throws SchedulerException;
// 通过名字获取
Scheduler getScheduler() throws SchedulerException;
// 返回当前 JVM 中通过该 Factory 创建的所有 Scheduler
Collection<Scheduler> getAllSchedulers() throws SchedulerException;
SchedulerRepository 单例,内部持有一个 Map HashMap<String, Scheduler> schedulers
类中,绑定 (bind),解绑 (remove) 都为同步方法,保证线程安全。
Scheduler
Scheduler 是一个很庞大的接口,它的实现主要有
- RemoteScheduler, via RMI
- StdScheduler, std
- JBoss4RMIRemoteMBeanScheduler, via JBoss’s JMX RMIAdaptor
Quartz 的核心实现也基本都在这些实现类中,Scheduler 可以用来定时触发任务。
CronScheduleBuilder
CronScheduleBuilder 用来将字符串的 cron 表达式变成 CronScheduleBuilder 对象,ScheduleBuilder 是一个抽象类
public class CronScheduleBuilder extends ScheduleBuilder<CronTrigger> {
public static CronScheduleBuilder cronSchedule(String cronExpression) { }
}
主要的实现有:
- CronScheduleBuilder 主要实现 cron 定时任务,通过字符表达式
- SimpleScheduleBuilder 比较简单的 ScheduleBuilder
- CalendarIntervalScheduleBuilder 看例子
withIntervalInDays(3)
每隔 3 天,如果要使用固定间隔的可以看一下这个 - DailyTimeIntervalScheduleBuilder 看例子比较简单
onDaysOfTheWeek(MONDAY, THURSDAY)
, 每一个周一和周四
比如
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpr());
trigger = TriggerBuilder.newTrigger().withIdentity(triggerId).withSchedule(scheduleBuilder)
.forJob(jobDetail).build();
scheduler.scheduleJob(jobDetail, trigger);