package schedule; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import org.quartz.CronExpression; import org.quartz.CronTrigger; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.impl.JobDetailImpl; import org.quartz.impl.StdSchedulerFactory; import org.quartz.impl.triggers.CronTriggerImpl; import org.quartz.impl.triggers.SimpleTriggerImpl; public class TriggerTest { public static void main(String[] args) throws SchedulerException, ParseException, InterruptedException { testSimpleTrigger(); //testCronTrigger(); } private static void testSimpleTrigger() throws SchedulerException, InterruptedException{ JobDetailImpl jobDetail = new JobDetailImpl(); jobDetail.setGroup("myGroup"); jobDetail.setJobClass(MyJob.class); jobDetail.setName("jobDetail"); SimpleTriggerImpl trigger = new SimpleTriggerImpl(); trigger.setStartTime(new Date()); trigger.setName("myTrigger"); trigger.setRepeatInterval(1000); trigger.setRepeatCount(1); /*job在endTime時再也不執行,但scheduler並未shutdown * Date c = new Date(); c.setTime(System.currentTimeMillis()+2000L); trigger.setEndTime(c);*/ Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); scheduler.shutdown(true); } }
執行時發現MyJob一次也沒執行,scheduler就shutDown了。後來在網上看到一篇回答java
http://stackoverflow.com/questions/15928980/quartz-scheduler-shuts-down-before-job-execution spa
答主提到了這些:I think you're misunderstanding the purpose of scheduler.shutdown(true);
It will wait for executing jobs to finish, but it will NOT wait for scheduled jobs to start and finish. Your job is not starting before you shutdown the scheduler.You could put a Thread.sleep(wait);
before you shut it down. code
原來是shutDown(true)只是等待scheduler執行完,而不是等等job完成。試着按答主的方法加了,即get
package schedule; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import org.quartz.CronExpression; import org.quartz.CronTrigger; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.impl.JobDetailImpl; import org.quartz.impl.StdSchedulerFactory; import org.quartz.impl.triggers.CronTriggerImpl; import org.quartz.impl.triggers.SimpleTriggerImpl; public class TriggerTest { public static void main(String[] args) throws SchedulerException, ParseException, InterruptedException { testSimpleTrigger(); //testCronTrigger(); } private static void testSimpleTrigger() throws SchedulerException, InterruptedException{ JobDetailImpl jobDetail = new JobDetailImpl(); jobDetail.setGroup("myGroup"); jobDetail.setJobClass(MyJob.class); jobDetail.setName("jobDetail"); SimpleTriggerImpl trigger = new SimpleTriggerImpl(); trigger.setStartTime(new Date()); trigger.setName("myTrigger"); trigger.setRepeatInterval(1000); trigger.setRepeatCount(1); /*job在endTime時再也不執行,但scheduler並未shutdown * Date c = new Date(); c.setTime(System.currentTimeMillis()+2000L); trigger.setEndTime(c);*/ Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); Thread.sleep(2000);//不加這一句,會在schedule觸發時即shutdown,而不是job執行完shutdown scheduler.shutdown(true); } }
給job留夠執行完成的時間,則在job重複執行一次後,scheduler關閉。it