一、Quartz简介
Quartz是OpenSymphony开源组织在Job scheduling领域的一个开源项目,它完全由Java开发,可以用来执行定时
任务。相较于Java自带的java.util.Timer,Quartz增加了很多功能,如持久性作业、丰富的触发器类型等。Quartz可
以集成于任何的Java应用,小到独立的应用,大至电子商务系统,都能够创建简单或复杂的调度,以执行上十、上百,
甚至上万的任务。
二、Quartz的核心组件
1.Scheduler(调度器):
负责整合Job和Trigger,并基于Trigger设定的时间来执行Job。
2.Job(任务):
开发者需要实现的一个接口,其中包含了需要被调度的业务逻辑。
3.JobDetail:
用于定义Job的实例,并为Job实例提供许多属性。每次Scheduler调度执行一个Job的时候,首先会拿到对应的JobDetail,然后创建该Job实例,再去执行Job中的execute()方法的内容。任务执行结束后,关联的Job对象实例会被释放,且会被JVM GC清除。
4.Trigger(触发器):
用于触发执行Job的条件。Trigger定义了一个已经被安排的任务将会在什么时候执行的时间条件。Quartz提供了两种类型的Trigger:SimpleTrigger和CronTrigger。SimpleTrigger主要用于需要重复执行的任务,而CronTrigger则基于Cron表达式,支持更复杂的时间规则。
三、Quartz Demo搭建
以下是一个简单的Quartz Demo,用于演示如何创建一个定时任务。
1.引入Quartz依赖:
如果你使用的是Maven项目,可以在pom.xml文件中添加Quartz的依赖项。例如:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
2.定义Job类:
创建一个实现Job接口的类,并在其中实现execute()方法。这个方法将包含需要被定时执行的业务逻辑。
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class PrintWordsJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String printTime = new SimpleDateFormat("yy-MM-dd HH-mm-ss").format(new Date());
System.out.println("PrintWordsJob start at:" + printTime + ", prints: Hello Job-" + new Random().nextInt(100));
}
}
3.创建Scheduler并配置Job和Trigger:
使用SchedulerFactory创建一个Scheduler实例。
使用JobBuilder创建一个JobDetail实例,并与PrintWordsJob类绑定。
使用TriggerBuilder创建一个Trigger实例,并设置触发条件(如每隔1秒执行一次)。
使用Scheduler的scheduleJob方法将JobDetail和Trigger关联起来,并启动Scheduler。
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class MyScheduler {
public static void main(String[] args) throws SchedulerException, InterruptedException {
// 创建调度器Scheduler
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// 创建JobDetail实例,并与PrintWordsJob类绑定
JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class)
.withIdentity("job1", "group1")
.build();
// 构建Trigger实例,每隔1秒执行一次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "triggerGroup1")
.startNow() // 立即生效
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1) // 每隔1秒执行一次
.repeatForever()) // 一直执行
.build();
// 执行
scheduler.scheduleJob(jobDetail, trigger);
System.out.println("--------scheduler start ! ------------");
scheduler.start(); // 启动调度器
// 让主线程睡眠一段时间,以便观察定时任务的执行
Thread.sleep(5000);
// 关闭调度器
scheduler.shutdown();
System.out.println("--------scheduler shutdown ! ------------");
}
}
4.运行Demo:
运行MyScheduler类的main方法,观察控制台输出。你应该会看到每隔1秒打印一次"PrintWordsJob start at:… prints: Hello Job-…"的信息。
四、总结
通过以上步骤,已经成功地搭建了一个简单的Quartz Demo,并创建了一个定时任务。Quartz框架提供了强大的任务调度功能,可以满足各种复杂的定时任务需求。在实际应用中,可以根据具体需求配置不同的Job和Trigger,以实现更复杂的业务逻辑。