Quartz是什么?
Quartz是一个开源的任务调度框架。基于定时、定期的策略来执行任务是它的核心功能,比如x年x月的每个星期五上午8点到9点,每隔10分钟执行1次。Quartz有3个核心要素:调度器(Scheduler)、任务(Job)、触发器(Trigger)。Quartz完全使用Java开发,可以集成到各种规模的应用程序中。它能够承载成千上万的任务调度,并且支持集群。它支持将数据存储到数据库中以实现持久化,并支持绝大多数的数据库。它将任务与触发设计为松耦合,即一个任务可以对应多个触发器,这样能够轻松构造出极为复杂的触发策略。
现在我们来看一个简单的示例:
public static void main(String arg[]) {
try {
//创建调度工厂
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
//从工厂中获取调度器
Scheduler scheduler = schedulerFactory.getScheduler();
//启动调度器
scheduler.start();
//创建job详细信息:创建helloJob实例并设置jobName和所属group,并设为当程序挂掉重启之后可重新恢复轮询
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity(JobKey.jobKey("jobName", "jobGroupName"))
.requestRecovery().build();
//创建一个simpleSchedule,轮询五次,间隔5秒钟
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withRepeatCount(5)
.withIntervalInSeconds(5);
//创建一个simpleTrigger 触发器,设置触发器的身份标识,绑定调度器,并设为立即启动
SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger().withIdentity("triggerName", "triggerGroupName")
.withSchedule(scheduleBuilder).startNow().build();
scheduler.scheduleJob(jobDetail, simpleTrigger);
} catch (SchedulerException e) {
System.out.println("报错");
}
}
接下来看一下HelloJob类,是一个实现了Job接口的类,它只有execute这一个方法。我们来看一job源码,以及hellojob代码:
hellojob代码:
public class HelloJob implements Job {
private static Logger logger = LoggerFactory.getLogger(HelloJob.class);
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
logger.info("hello jon执行时间: " + LocalTime.now());
System.out.print("hello jon执行时间: " + LocalTime.now());
}
}
job源码:
public interface Job {
void execute(JobExecutionContext var1) throws JobExecutionException;
}
至此我们实现了一个简单调度任,当Job的Trigger激活时,该方法将被Scheduler的一个线程调用执行。JobExecutionContext 是传递给该方法的运行时环境信息,包括调用它的调度器、触发该执行的Trigger、JobDetail对象以及其他信息。
接下来我们来看一下上面用到jobDetail以及schedule等核心api和触发器的介绍
核心api和触发器的介绍
Quartz API主要包含以下接口:
Scheduler:与调度器交互的主要API。
Job:一个接口,实现该接口的组件将被调度器运行。
JobDetail:用于定义Job实例。JobDetail是在Job被添加到Scheduler时由应用程序创建的,它包含了关于Job的各种属性信息,都在JobDataMap中
Trigger:定义了一个Job如何被调度器所运行。Trigger用于触发任务的执行。它也会关联到的一个JobDataMap–当需要把数据传递给触发器特定的某个任务时这很有用。Quartz提供了各种触发器,然而最常用的是SimpleTrigger 和CronTrigger。
JobBuilder:用于定义/构建JobDetail 实例。
TriggerBuilder:用于定义/构建Trigger实例。
DateBuilder:用于创建时间类型的实例。
Scheduler由SchedulerFactory创建,并随着shutdown方法的调用而终止。创建后它将可被用来添加、删除或列出Job和Trigger,或执行一些调度相关的工作,(比如暂停)。只有通过start()方法启动后它才会真的工作。
Job与JobDetail关系
JobDetail 定义的是任务数据,而真正的执行逻辑是在Job中,例子中是HelloJob。 为什么设计成JobDetail + Job,不直接使用Job?这是因为任务是有可能并发执行,如果Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题。而JobDetail & Job 方式,sheduler每次执行,都会根据JobDetai