1.概述
Quartz是一个完全由Java编写的开源任务调度框架,通过触发器来设置作业定时运行规则,控制作业的运行时间。Quartz框架的主要核心组件包括调度器、触发器和作业。调度器作为作业的总指挥,触发器作为作业的操作者,而作业则为应用的功能模块。Quartz集群通过故障切换和负载平衡的功能,为调度器提供了高可用性和伸缩性。
Quartz主要用于执行定时任务,如定时发送信息、定时生成报表等。它提供了强大的任务调度机制,允许开发人员灵活地定义触发器的调度时间表,并可将触发器和任务进行关联映射。此外,Quartz还支持任务和调度的多种组合方式,以及调度数据的多种存储方式。
2. Quartz的核心元素
Quartz调度依靠的三大核心元素就是:Scheduler、Trigger、Job、JobDetail。
1. Job(任务)
作用:具体要执行的业务逻辑,比如:发送短信、发送邮件、访问数据库、同步数据等。
在 Quartz 中,JobDetail 通常与 Trigger 一起使用来定义作业的调度计划。Trigger 负责定义作业的执行时间、频率等动态信息,而 JobDetail 则提供了作业本身的描述。当调度器触发一个作业时,它会根据 JobDetail 中的信息来创建作业实例,并执行该实例的 execute 方法。
2.JobDetail
JobDetail 的主要作用包括:
- 提供作业信息:JobDetail 实例包含了作业的完整描述,包括作业类名、名称、组名等。这些信息对于调度器来说非常重要,因为它们帮助调度器识别和管理不同的作业。
- 存储作业数据:JobDetail 还包含了一个 JobDataMap 成员变量,用于存储特定作业实例的状态信息。JobDataMap 可以包含任何可以被序列化的对象,这使得你可以在调度作业时传递额外的数据给作业实例。
- 支持作业持久化:在 Quartz 中,JobDetail 实例可以被持久化到数据库中,以实现作业的持久化调度。这样,即使应用程序重新启动或崩溃,已经定义的作业仍然会被保留,并在适当的时候被调度执行。
3. Trigger(触发器)
作用:用来定义Job(任务)触发条件、触发时间,触发间隔,终止时间等。
四大类型:SimpleTrigger、CornTrigger、DateIntervalTrigger、NthIncludedDayTrigger。
- SimpleTrigger:
SimpleTrigger
用于在指定的开始时间和结束时间内,根据给定的重复计数和重复间隔来触发作业执行。- 它适用于需要在固定时间间隔内重复执行的任务,例如每隔10分钟执行一次。
SimpleTrigger
的属性包括开始时间、结束时间、重复计数和重复间隔。- 如果指定了结束时间,并且重复计数达到了设定的值,触发器将停止触发作业。
SimpleTrigger
的一个潜在问题是,如果作业错过了一次触发时间(例如由于系统停机),那么下次触发时间可能会受到影响,导致作业的执行时间变得不规律。- CronTrigger:
CronTrigger
使用类似于Unix cron表达式的字符串来定义作业的执行时间表。- 它允许更复杂的调度规则,例如每月的第一个周一执行,或者在每个月的特定日期和时间的组合上执行。
- Cron表达式提供了秒、分钟、小时、日期、月份和星期等字段,可以灵活地定义时间规则。
CronTrigger
适用于需要按照固定日历模式执行的任务。- DateIntervalTrigger:
DateIntervalTrigger
是在Quartz 1.7及更高版本中引入的,用于在固定的时间间隔内触发作业,例如每N小时、每N天或每N周。- 它特别适合调度需要定期重复但不需要考虑日历相关规则(如每月的第一个周一)的任务。
DateIntervalTrigger
的属性包括开始时间、结束时间、时间间隔单位和时间间隔数量。- NthIncludedDayTrigger:
NthIncludedDayTrigger
是Quartz中较新的触发器类型,用于在每个月的第N天执行作业。- 例如,如果你需要在每个月的第15天执行一个作业,你可以使用这个触发器来设置。
- 这个触发器特别适用于那些需要在每个月的固定日期执行的任务。
4. scheduler(调度器)
作用:Scheduler启动Trigger去执行Job。
类型:Scheduler由scheduler工厂创建:DirectSchedulerFactory 或者 StdSchedulerFactory。
第二种工厂StdSchedulerFactory使用较多,因为 DirectSchedulerFactory 使用起来不够方便,需要作许多详细的手工编码设置。
Scheduler 主要有三种:RemoteMBeanScheduler, RemoteScheduler 和 StdScheduler。
3.Quartz的简单使用
1. 引入依赖:
项目中引入Quartz框架的依赖。如果您使用Maven构建项目,可以在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
2. 定义作业(Job):
创建一个类实现org.quartz.Job接口,并实现execute方法。这个方法将在作业被调度时执行。
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
// 这里是定时任务的逻辑部分
System.out.println("MyJob is executing.");
}
}
3. 定义触发器(Trigger):
创建一个触发器来定义作业的执行计划。触发器可以指定作业的开始时间、结束时间、执行间隔等。
4.配置调度器(Scheduler):
创建一个调度器实例,并使用它来安排作业和触发器。
package schedule;
import job.MyJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class MySchedule {
public static void main(String[] args) {
// 创建作业详情
JobDetail jobDetail = JobBuilder.newJob(MyJob.class)//作业的类名
.withIdentity("myJob", "group1")//作业的身份标识(名称和组名)
.build();
//创建触发器
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")//触发器的身份标识(名称和组名)
.withSchedule(SimpleScheduleBuilder.simpleSchedule()//设置触发器的调度计划
.withIntervalInSeconds(3)//设置作业执行的间隔时间为3秒。
.repeatForever())//指定触发器应该无限次地重复执行作业。
.build();
try {
// 创建调度器实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 将作业和触发器注册到调度器
scheduler.scheduleJob(jobDetail, trigger);
// 开始调度器
scheduler.start();
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
在上面的代码中,myJobDetail是一个JobDetail实例,它包含了作业的详细信息(如作业类名等)。您需要先创建JobDetail实例,并将其与作业类关联。
5.实现结果
6.关闭调度器
try {
scheduler.shutdown(true);
} catch (SchedulerException se) {
se.printStackTrace();
}