首先 Quartz 是一个开源的任务调度框架。为在Java应用程序中进行复杂作业调度或定时任务等提供了简单却强大的机制。
Quzrtz允许开发人员在不同的时间间隔(年、月、日、周、时等)定义触发器,到了特定的时间,触发相应的Job进行作业。
Quzrtz基本结构:
任务调度器Scheduler:
scheduler是quartz的核心,管理job,trigger等。Trigger和JobDetail可以注册到Scheduler中。其中Trigger和JobDetzil的组和名称必须唯一。
作业Job:
job就是一个需要执行任务的Java类,实现了org.quartz.Job接口,当scheduler调用该方法时,就执行execute方法。里面写具体的业务逻辑。
JobDetail:quartz在每次执行Job时,都重新创建一个Job实例。JobDetail类就是一个用来描述Job的实现及其它相关静态信息的类。JobDetail(String name, group, java.lang.Class jobClass),该构造函数要求指定Job的实现类,以及任务在Scheduler中的组名和Job名称;
触发器Trigger:
trigger描述Job执行时间的触发规则,决定何时去执行一个job。用的比较多的是SimpleTrigger(简单触发器)和CronTrigger(基于cron表达式)。下面会有代码解释的。
下面来看代码,下面的QuartzManager封装了两个基于不同触发器的定时方法。
public class QuartzManager {
private SchedulerFactory sf= new StdSchedulerFactory();
/**
* @description 基于简单触发器 实现基本定时功能
* @date 2018/8/19 0:39
* @param jobName 任务名
* @param jobGroupName 任务组名
* @param triggerName 触发器名
* @param triggerGroupName 触发器组名
* @param job 任务类
* @param time 间隔多久执行一次
* @param startTime 起始时间
* @param endTime 结束时间
* @return void
*/
public void addSimpleJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Job job, long time, Date startTime, Date endTime) throws SchedulerException {
Scheduler schd=sf.getScheduler();
//实例化jobdetail
JobDetail jobDetail=new JobDetail(jobName,jobGroupName,job.getClass());
//实例化触发器
SimpleTrigger trigger=new SimpleTrigger(triggerName,triggerGroupName,jobName,jobGroupName,startTime,endTime,SimpleTrigger.REPEAT_INDEFINITELY,time*1000L);
//两者组成一个计划任务注册到scheduler
schd.scheduleJob(jobDetail,trigger);
if(!schd.isShutdown()){
schd.start();//启动调度器
}
}
/**
* @description 基于cron表达式 实现任务调度
* @date 2018/8/19 11:01
* @param jobName
* @param jobGroupName
* @param triggerName
* @param triggerGroupName
* @param job
* @param time
* @return void
*/
public void addCronJob(String jobName,String jobGroupName,String triggerName,String triggerGroupName,Job job,String time) throws SchedulerException {
Scheduler sched=sf.getScheduler();
//实例化jobdetail
JobDetail jobDetail=new JobDetail(jobName,jobGroupName,job.getClass());
//实例化触发器
CronTrigger trigger=new CronTrigger(triggerName,triggerGroupName);
try {
trigger.setCronExpression(time);//触发器时间设定
} catch (ParseException e) {
e.printStackTrace();
}
sched.scheduleJob(jobDetail,trigger);
if(!sched.isShutdown()){
sched.start();//启动调度器
}
}
}
JOB:
public class helloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("hello everyone:"+sdf.format(new Date()));
}
}
写一个main方法测试:
public class quzrtzTest {
private static String JOB_NAME = "JOB_NAME_";
private static String JOB_GROUP_NAME = "JOB_GROUP_NAME_";
private static String TRIGGER_NAME = "TRIGGER_NAME_";
private static String TRIGGER_GROUP_NAME = "TRIGGER_GROUP_NAME_";
public static void main(String[] args) throws SchedulerException {
QuartzManager quartzManager = new QuartzManager();
helloJob job = new helloJob();
String id = "hello";
//设置当前开始时间、每隔10秒执行一次、一直循环的任务
quartzManager.addSimpleJob(JOB_NAME + id, JOB_GROUP_NAME + id, TRIGGER_NAME + id, TRIGGER_GROUP_NAME + id, job, 10, new Date(), null);
String id1="world";
String time="0 0 12 * * ?";
//设置每天12点执行
quartzManager.addCronJob(JOB_NAME+id1,JOB_GROUP_NAME+id1,TRIGGER_NAME+id1,TRIGGER_GROUP_NAME+id1,job,time);
}
}
测试的时候第二个调度任务设置了11点31,可以看到上面输出了两次,说明两个调度任务,都在11点31,调用了同一个job.