Quartz scheduler 简介
Quartz scheduler是一款优秀的Java调度器,开发人员可以很容易的将需调度的任务(task)加入调度器(scheduler)中调度运行。
如何将task加入调度器,我们首先介绍几个概念:
- Scheduler Task – 纯Java类,就是开发人员需要调度的任务。
- Scheduler Job – 通过JobDetail获得执行任务的详细信息,定义执行方式。类似于执行模板,核心方法是execute()。
- Scheduler JobDetail – JobDetail负责存储要调度job的详细信息,task相关数据,包括任务名,任务相关数据等。
- Trigger – 触发器定义任务触发时机。
- Scheduler – 将任务和触发器连接在一起,调用任务执行。
下面通过一个例子讲解Quartz如何工作。
首先,我们定义具体执行的任务。
package quartz.test;
public class RunMeTask
{
public void printMe() {
System.out.println("Run Me ~");
}
}
定义Job,本例中RunMeJob通过JobDataMap获得了需要执行的task实例,运行相应的方法。
package quartz.test;
import java.util.Map;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class RunMeJob implements Job
{
public void execute(JobExecutionContext context)
throws JobExecutionException {
Map dataMap = context.getJobDetail().getJobDataMap();
RunMeTask task = (RunMeTask)dataMap.get("runMeTask");
task.printMe();
}
}
定义JobDetail,将RunMeTask实例添加到JobDetail的JobDataMap中
RunMeTask task = new RunMeTask();
//specify your sceduler task details
JobDetail job = new JobDetail();
job.setName("runMeJob");
job.setJobClass(RunMeJob.class);
Map dataMap = job.getJobDataMap();
dataMap.put("runMeTask", task);
触发器,Quartz有两种触发器:
- SimpleTrigger – 允许设定开始时间、结束时间、重复间隔等。
- CronTrigger – 使用 Unix cron expression 指定运行Job的时机。
SimpleTrigger trigger = new SimpleTrigger();
trigger.setName("runMeJobTesting");
trigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
trigger.setRepeatInterval(30000);
//configure the scheduler time
CronTrigger trigger = new CronTrigger();
trigger.setName("runMeJobTesting");
trigger.setCronExpression("0/30 * * * * ?");
调度器,把trigger和JobDetail连接在一起进行调度。
//schedule it
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
完整实例
Simple trigger
package quartz.test;
import java.util.Date;
import java.util.Map;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzAppSimpleTrigger
{
public static void main( String[] args ) throws Exception
{
RunMeTask task = new RunMeTask();
//specify your sceduler task details
JobDetail job = new JobDetail();
job.setName("runMeJob");
job.setJobClass(RunMeJob.class);
Map dataMap = job.getJobDataMap();
dataMap.put("runMeTask", task);
//configure the scheduler time
SimpleTrigger trigger = new SimpleTrigger();
trigger.setName("runMeJobTesting");
trigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
trigger.setRepeatInterval(30000);
//schedule it
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
}
}
CronTrigger
package quartz.test;
import java.util.Map;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzAppCronTrigger
{
public static void main( String[] args ) throws Exception
{
RunMeTask task = new RunMeTask();
//specify your sceduler task details
JobDetail job = new JobDetail();
job.setName("runMeJob");
job.setJobClass(RunMeJob.class);
Map dataMap = job.getJobDataMap();
dataMap.put("runMeTask", task);
//configure the scheduler time
CronTrigger trigger = new CronTrigger();
trigger.setName("runMeJobTesting");
trigger.setCronExpression("0/30 * * * * ?");
//schedule it
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
}
}