Quartz入门例子简介 从入门到菜鸟(二)
本节补充一些SimpleTrigger的API使用,文章一次性写的太长会大大降低可阅读性,所以还是少食多餐吧。
顺大便回顾一下Quartz的基本使用方法,联系windows自带的计划任务,假想场景如下:
1.我要让电脑查杀病毒(对应Quartz: 实现Job接口的execute方法,后期通过反射实例化JobDetail对象)。2.我想让电脑在五分钟之后做查杀病毒这个job(对应Quartz:通过TriggerBuilder来new出一个时间为五分钟之后的Trigger)。3.把上面我想象到的时间:五分钟之后;任务:查杀病毒 放到windows的定时任务当中,点击确定(对应Quartz:通过SchedulerFactory拿到Scheduler实例,将JobDetail与Trigger通过scheduleJob方法注册到Scheduler中,再调用start方法就可以了)。
下面先对MyJob做个小改动,让我们定义的任务Key打印出来。
public class MyJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException { // @NOTICE JobExecutionContext 是任务执行的上下文,可以拿到任务的KeyString jobName = context.getJobDetail().getKey().getName();System.out.println("任务Key:" + jobName + " 正在执行,执行时间: " + Calendar.getInstance().getTime());}}public class QuartzMultiJobTest {public static void main(String[] args) throws Throwable {SchedulerFactory factory = new StdSchedulerFactory();Scheduler scheduler = factory.getScheduler();// @NOTICE 任务的开始时间,nextGivenSecondDate方法表示:当前时间之后,每当秒数是13的倍数都是触发时间,当然只触发一次// 比如:00:00:12秒开始主线程,则13秒就会触发任务,如果00:00:14秒开始主线程,则在26秒触发任务Date runTime = DateBuilder.nextGivenSecondDate(null, 13);JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();scheduler.scheduleJob(job, trigger);// @NOTICE 将同一个Job实现作为另外一个任务注册到scheduler,注意名字要区分job = JobBuilder.newJob(MyJob.class).withIdentity("job2", "group1").build();trigger = TriggerBuilder.newTrigger().withIdentity("trigger2", "group1").startAt(runTime).build();scheduler.scheduleJob(job, trigger);// @NOTICE 重复执行,job3表示第一次执行完之后,每隔3秒钟执行一次,重复5次,withRepeatCount参数不包括第一次执行那次,即job3总共执行6次job = JobBuilder.newJob(MyJob.class).withIdentity("job3", "group1").build();trigger = TriggerBuilder.newTrigger().withIdentity("trigger3", "group1").withSchedule(SimpleScheduleBuilder.simpleSchedule().withRepeatCount(5).withIntervalInSeconds(3)).startAt(runTime).build();scheduler.scheduleJob(job, trigger);scheduler.start();try {// 等待20秒Thread.sleep(20L * 1000L);} catch (Exception e) {}scheduler.shutdown(true);}}