个人觉得无论使用SimpleTrigger 还是CronTirgger 都可以分为以下几个步骤:
- 定义一个简单的 任务job 类
- 创建一个调度类
在调度类中做如下操作:
- 通过 StdSchedulerFactory 获取调度器的实例
- 获取一个 quartz 的独立运行的容器
- 创建一个JobDetail 并指定 Job在Scheduler 中所属组及名称
- 创建一个Trigger 并指定任务开始执行的时间,重复次数、时间间隔等
- 添加 JobDetail 到 scheluder 容器中去,并且和Trigger关联,返回执行时间
- 启动任务调度程序
- 关闭任务调度程序
具体代码如下:
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
// TODO Auto-generated method stub
JobKey jobKey = context.getJobDetail().getKey();
System.out.println("SimpleJob says:"+jobKey+" excuting at" + new Date());
}
}
上面的是定义一个简单的 job 类的代码
用SimpleTrigger 实现定时任务的代码如下:
import java.util.Date;
import org.quartz.DateBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class SimpleTriggerDemo1 {
public void run() throws SchedulerException{
//通过StdSchedulerFactory 获取一个调度器的实例
StdSchedulerFactory factory = new StdSchedulerFactory();
//代表 一个quartz的独立运行的容器
Scheduler scheduler = factory.getScheduler();
// 获取当前时间15s后的时间
Date startDate = DateBuilder.nextGivenSecondDate(null, 15);
// 开始定义一个job1
//创建一个jobDeatil实例并指定Job在Scheduler 中所属组及名称
/**
* 定义一个job,并绑定到我们自定义的SimpleJob.class对象中
* 这里不会马上创建一个SimpleJob的实例,实例创建是在scheduler安排任务触发执行
* 这种机制也为后面使用Spring集成提供了便利
*/
JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class).withIdentity("job9","group1").build();
//SimpleTrigger 实现Trigger接口的子接口,此处只指定了开始执行定时任务时间,使用默认的重复次数(0次)和重复间隔(0秒)
SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger9","group1").startAt(startDate).build();
//添加jobDeatil到scheluder容器中去,并且和Trigger关联,返回执行时间
// 告诉quartz使用定义的触发器trigger安排执行任务job
Date date = scheduler.scheduleJob(jobDetail,simpleTrigger);
System.out.println(jobDetail.getKey()+"will run at:"+date+" and repeat:"+simpleTrigger.getRepeatCount()+simpleTrigger.getRepeatInterval()/100L+" s");
// job1结束
// job2开始
jobDetail = JobBuilder.newJob(SimpleJob.class).withIdentity("job2","group1").build();
simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger2","group1").startAt(startDate).build();
date = scheduler.scheduleJob(jobDetail,simpleTrigger);
System.out.println(jobDetail.getKey() + " will run at: " + date + " and repeat: " + simpleTrigger.getRepeatCount()
+ " times, every " + simpleTrigger.getRepeatInterval() / 1000L + " seconds");
//job2结束
// job3开始
//任务执行规则为在指定的时间开始进行执行,每十秒执行一次重复执行十次
jobDetail = JobBuilder.newJob(SimpleJob.class).withIdentity("job3","group1").build();
simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger3","group1").startAt(startDate)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10)).build();
scheduler.scheduleJob(jobDetail,simpleTrigger);
//forjob 指定trigger对应的定时任务,另外一种实现形式,此trigger和上面的trigger共同出发一个任务,各自均执行
simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger3","group1").startAt(startDate)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10)).forJob(jobDetail).build();
System.out.println(jobDetail.getKey() + " will run at: " + date + " and repeat: " + simpleTrigger.getRepeatCount()
+ " times, every " + simpleTrigger.getRepeatInterval() / 1000L + " seconds");
// job3结束
// job4开始
jobDetail = JobBuilder.newJob(SimpleJob.class).withIdentity("job4","group1").build();
simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger4","group1").startAt(startDate)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).withRepeatCount(5)).build();
date = scheduler.scheduleJob(jobDetail,simpleTrigger);
System.out.println(jobDetail.getKey() + " will run at: " + date + " and repeat: " + simpleTrigger.getRepeatCount()
+ " times, every " + simpleTrigger.getRepeatInterval() / 1000L + " seconds");
// job5开始
jobDetail = JobBuilder.newJob(SimpleJob.class).withIdentity("job5","group1").build();
simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger5","group1").startAt(DateBuilder.futureDate(5,DateBuilder.IntervalUnit.MINUTE)).build();
date = scheduler.scheduleJob(jobDetail,simpleTrigger);
System.out.println(jobDetail.getKey() + " will run at: " + date + " and repeat: " + simpleTrigger.getRepeatCount()
+ " times, every " + simpleTrigger.getRepeatInterval() / 1000L + " seconds");
// job5结束
// job6结束
jobDetail = JobBuilder.newJob(SimpleJob.class).withIdentity("job6","group1").build();
simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger6","group1").startAt(startDate)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(40).repeatForever()).build();
date = scheduler.scheduleJob(jobDetail,simpleTrigger);
System.out.println(jobDetail.getKey() + " will run at: " + date + " and repeat: " + simpleTrigger.getRepeatCount()
+ " times, every " + simpleTrigger.getRepeatInterval() / 1000L + " seconds");
// job6结束
//在scheduler.start()之后调用,可以重新定义trigger重新注册
System.out.println("-----------------Starting Scheduler-----------------");
scheduler.start();
System.out.println("-----------------Starting Scheduler-----------------");
//job7开始
jobDetail = JobBuilder.newJob(SimpleJob.class).withIdentity("job7","group1").build();
simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger7","group1").startAt(startDate)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(5).withRepeatCount(20)).build();
date = scheduler.scheduleJob(jobDetail,simpleTrigger);
System.out.println(jobDetail.getKey() + " will run at: " + date + " and repeat: " + simpleTrigger.getRepeatCount()
+ " times, every " + simpleTrigger.getRepeatInterval() / 1000L + " seconds");
//job7结束
//job8开始
//storeDurly(),没有触发器指向任务的时候,将任务保存在队列中,然后可以通过手动触发
jobDetail = JobBuilder.newJob(SimpleJob.class).withIdentity("job8","group1").storeDurably().build();
//任务立即执行
scheduler.addJob(jobDetail, true);
System.out.println("手动触发triggering job8.。。。。。");
scheduler.triggerJob(JobKey.jobKey("job8","group1"));
//job8结束
//启动任务调度程序,内部机制是线程的启动
scheduler.start();
try {
Thread.sleep(60000L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//对job7重新安排
System.out.println("------------------Rescheduling-----------------");
simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger7","group1").startAt(startDate)
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(5).withRepeatCount(20)).build();
date = scheduler.scheduleJob(jobDetail,simpleTrigger);
System.out.println("job7 rescheduled to run at: " + date);
System.out.println("------- Waiting five minutes... ------------");
try {
Thread.sleep(60000L);
} catch (Exception ex) {
}
//关闭任务调度程序,如果不关闭,调度程序schedule会一直运行着
scheduler.shutdown(true);
SchedulerMetaData metaData = scheduler.getMetaData();
System.out.println("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");
}
public static void main(String[] args) throws SchedulerException{
SimpleTriggerDemo1 demo1 = new SimpleTriggerDemo1();
demo1.run();
}
}
运行结果如图所示:
使用 CronTrigger 来实现定时任务的代码如下:
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class CronTriggerDemo {
public void run() throws Exception{
System.out.println("------------初始化----------");
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
System.out.println("------------初始化完成----------");
System.out.println("------------向scheduler加入job----------");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class).withIdentity("job1","group1").build();
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("tirgger1", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0/20 * * * * ?")).build();
Date date = scheduler.scheduleJob(jobDetail, trigger);
System.out.println(jobDetail.getKey() + " 已经在 : " + simpleDateFormat.format(date) + " 时运行,Cron表达式:" + trigger.getCronExpression());
System.out.println("--------------------------------shceduler调用开始----------------------------");
scheduler.start();
System.out.println("---------------------------------scheduler调用结束-------------------------");
try
{
Thread.sleep(300000L);
}
catch (Exception e)
{
}
System.out.println("------- 关闭Scheduler ---------------------");
scheduler.shutdown(true);
System.out.println("------- 关闭完成 -----------------");
SchedulerMetaData metaData = scheduler.getMetaData();
System.out.println("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");
}
public static void main(String[] args) throws Exception{
CronTriggerDemo cornTriggerDemo = new CronTriggerDemo();
cornTriggerDemo.run();
}
}
运行结果如图所示:
以上两个demo 都是用 RAMJobStore 的存储方式