Job1類java
package org.quartz.examples.example6; import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.quartz.PersistJobDataAfterExecution; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; /** * <p> * 一個會引起做業執行異常的做業 * </p> */ @PersistJobDataAfterExecution // 持久化JobDataMap裏的數據,使下一個定時任務還能獲取到這些值 @DisallowConcurrentExecution // 禁止併發多任務執行,因此永遠只有一個任務在執行中 public class BadJob1 implements Job { // Logging private static Logger LOG = LoggerFactory.getLogger(BadJob1.class); private int calculation; //必需要有public修飾的無參構造函數 public BadJob1() { } //定時器執行方法 public void execute(JobExecutionContext context) throws JobExecutionException { JobKey jobKey = context.getJobDetail().getKey(); JobDataMap dataMap = context.getJobDetail().getJobDataMap(); int denominator = dataMap.getInt("denominator"); LOG.info("---" + jobKey + " executing at " + new Date() + " with denominator " + denominator); // 一我的爲設計的異常示例,該異常將由該做業生成,緣由是除0錯誤(僅在第一次運行時) try { calculation = 4815 / denominator; } catch (Exception e) { LOG.info("--- Error in job!"); JobExecutionException e2 = new JobExecutionException(e); // 修正分母,以便下次做業運行時不會再次失敗 dataMap.put("denominator", "1"); // 是否當即從新觸發任務?true e2.setRefireImmediately(true); throw e2; } LOG.info("---" + jobKey + " completed at " + new Date()); } }
Job2類併發
package org.quartz.examples.example6; import java.util.Date; import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.quartz.PersistJobDataAfterExecution; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * <p> * 一個會引起做業執行異常的做業 * </p> */ @PersistJobDataAfterExecution // 持久化JobDataMap裏的數據,使下一個定時任務還能獲取到這些值 @DisallowConcurrentExecution // 禁止併發多任務執行,因此永遠只有一個任務在執行中 public class BadJob2 implements Job { // Logging private static Logger LOG = LoggerFactory.getLogger(BadJob2.class); private int calculation; // 必需要有public修飾的無參構造函數 public BadJob2() { } // 定時器執行方法 public void execute(JobExecutionContext context) throws JobExecutionException { JobKey jobKey = context.getJobDetail().getKey(); LOG.info("---" + jobKey + " executing at " + new Date()); // 一我的爲設計的異常示例,該異常將由該做業因爲除零錯誤而生成 try { int zero = 0; calculation = 4815 / zero; } catch (Exception e) { LOG.info("--- Error in job!"); JobExecutionException e2 = new JobExecutionException(e); // Quartz將自動取消與此做業關聯的全部觸發器的調度,這樣它就不會再次運行 e2.setUnscheduleAllTriggers(true); throw e2; } LOG.info("---" + jobKey + " completed at " + new Date()); } }
任務調度類函數
package org.quartz.examples.example6; import static org.quartz.DateBuilder.nextGivenSecondDate; import static org.quartz.JobBuilder.newJob; import static org.quartz.SimpleScheduleBuilder.simpleSchedule; import static org.quartz.TriggerBuilder.newTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.SchedulerMetaData; import org.quartz.SimpleTrigger; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; /** * 這個做業演示了Quartz如何處理做業拋出的JobExecutionExceptions */ public class JobExceptionExample { Logger LOG = LoggerFactory.getLogger(JobExceptionExample.class); public void run() throws Exception { // 初始化一個調度工廠,並實例化一個調度類 SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); // 第一個參數:null就是默認當前時間,也能夠指定時間 // 第二個參數:把一分鐘按15進行劃分,也就是60/15等份。 // 舉例:當前時間是21:01:27,那麼startTime就是21:15:00。當前時間是21:35:32,那麼startTime就是21:45:00。 Date startTime = nextGivenSecondDate(null, 15); // ======================================================== // ============ badJob1將每10秒運行一次,此做業將拋出異常並當即從新啓動。 // ======================================================== JobDetail job = newJob(BadJob1.class).withIdentity("badJob1", "group1").usingJobData("denominator", "0") .build(); // 觸發器每間隔10秒執行一次,無限循環 SimpleTrigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(startTime) .withSchedule(simpleSchedule().withIntervalInSeconds(10).repeatForever()).build(); Date ft = sched.scheduleJob(job, trigger); LOG.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + trigger.getRepeatInterval() / 1000 + " seconds"); // ======================================================== // ============ badJob2將每5秒運行一次,此做業將拋出異常,在異常catch塊裏取消了使用該任務觸發器的全部任務的觸發,而且永不從新啓動。 // ======================================================== JobDetail job2 = newJob(BadJob2.class).withIdentity("badJob2", "group1").build(); // 觸發器每間隔5秒執行一次,無限循環 SimpleTrigger trigger2 = newTrigger().withIdentity("trigger2", "group1").startAt(startTime) .withSchedule(simpleSchedule().withIntervalInSeconds(5).repeatForever()).build(); Date ft2 = sched.scheduleJob(job2, trigger2); LOG.info(job2.getKey() + " will run at: " + ft2 + " and repeat: " + trigger2.getRepeatCount() + " times, every " + trigger2.getRepeatInterval() / 1000 + " seconds"); sched.start(); Thread.sleep(30L * 1000L); sched.shutdown(false); LOG.info("------- Shutdown Complete -----------------"); SchedulerMetaData metaData = sched.getMetaData(); LOG.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs."); } public static void main(String[] args) throws Exception { JobExceptionExample example = new JobExceptionExample(); example.run(); } }