官網:www.quartz-scheduler.orghtml
組件模式:最終要的三部分:日任務job,觸發器trigger,調度器schedulejava
全部的任務調度都要經過execute完成數據庫
入門案例:json
public class HelloJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 輸出當前時間 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dataString = sdf.format(date); // 工做內容 System.out.println("正在進行數據庫的備份工做,備份數據庫的時間是:" + dataString); } }
public class HelloScheduleDemo { public static void main(String[] args) throws Exception { // 1.調度器(Scheduler) ,從工廠中獲取調度的實例(默認:實例化) Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 2.任務實例 JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1") // 參數1:任務的名稱;參數2:任務組的名稱 .build(); // 3.觸發器 SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger", "group1")// 參數1:觸發器名稱;參數2:觸發器組的名稱 .startNow()// 立刻啓動觸發器 .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5)).build(); // 讓調度器關聯任務和觸發器,保證按照觸發器定義的條件執行任務 scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); } }
public class HelloScheduleDemo { public static void main(String[] args) throws Exception { // 1.調度器(Scheduler) ,從工廠中獲取調度的實例(默認:實例化) Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 2.任務實例 JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1") // 參數1:任務的名稱;參數2:任務組的名稱 .build(); System.out.println("名稱:" + jobDetail.getKey().getName()); System.out.println("組的名稱:" + jobDetail.getKey().getGroup()); System.out.println("任務類" + jobDetail.getJobClass().getName()); // 3.觸發器 SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger", "group1")// 參數1:觸發器名稱;參數2:觸發器組的名稱 .startNow()// 立刻啓動觸發器 .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5)).build(); // 讓調度器關聯任務和觸發器,保證按照觸發器定義的條件執行任務 scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); } }
輸出:windows
名稱:job1 組的名稱:group1 任務類com.quartz.HelloJob INFO [main] - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started. 正在進行數據庫的備份工做,備份數據庫的時間是:2019-09-04 23:06:49 正在進行數據庫的備份工做,備份數據庫的時間是:2019-09-04 23:06:54 正在進行數據庫的備份工做,備份數據庫的時間是:2019-09-04 23:06:59 正在進行數據庫的備份工做,備份數據庫的時間是:2019-09-04 23:07:04 正在進行數據庫的備份工做,備份數據庫的時間是:2019-09-04 23:07:09 正在進行數據庫的備份工做,備份數據庫的時間是:2019-09-04 23:07:14
HelloSchedulerDemo.javaide
HelloJob.java工具
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); // 從JobDetail中獲取JobDataMap的數據 String jobDataMessage = jobDataMap.getString("message"); System.out.println("任務數據的參數值:" + jobDataMessage); // 獲取Trigger對象中獲取JobDataMap的數據 JobDataMap jobDataMap2 = context.getTrigger().getJobDataMap(); String triggerDataMessage = jobDataMap2.getString("message"); System.out.println("觸發器數據的參數值:" + triggerDataMessage); //獲取trigger的內容 TriggerKey triggerKey=context.getTrigger().getKey(); System.out.println("觸發器名稱:"+triggerKey.getName()+";觸發器組:"+triggerKey.getGroup()); System.out.println("****************"); //獲取其餘內容 System.out.println("當前任務執行時間:"+sdf.format(context.getFireTime())); System.out.println("下一次任務執行時間:"+sdf.format(context.getNextFireTime()));
若是想要獲取job的數據,key不能設置和trigger同樣ui
public class HelloSchedulerDemoTrigger { public static void main(String[] args) throws Exception { //設置任務的開始時間 Date startDate = new Date(); startDate.setTime(startDate.getTime()+3000); //設置任務的結束時間 Date endDate = new Date(); endDate.setTime(endDate.getTime()+10000); //1.調度器(Scheduler),從工廠中獲取調度的實例(默認:實例化new StdSchedulerFactory()) Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler(); //2.任務實例(JobDetail) JobDetail jobDetail = JobBuilder.newJob(HelloJobTrigger.class) .withIdentity("job1", "group1")// .usingJobData("message", "打印日誌")//傳遞參數,名稱message .build(); //3.觸發器(Trigger) Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger", "group1") // .startNow()//立刻啓動觸發器 .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5)) .startAt(startDate)//設置任務開始時間 .endAt(endDate)//設置任務結束時間 .build(); //讓調度器關聯任務和觸發器,保證按照觸發器定義的條件執行任務 defaultScheduler.scheduleJob(jobDetail, trigger); //啓動 defaultScheduler.start(); } }
public class HelloJobTrigger implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { //輸出當前日期 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = sdf.format(date); //工做內容 System.out.println("正在進行數據庫的備份工做" + dateString); //獲取jobKey、startTime、endTime Trigger trigger = context.getTrigger(); System.out.println("jobKey的名稱:" + trigger.getJobKey().getName()); System.out.println("jobKey組的名稱:" + trigger.getJobKey().getGroup()); System.out.println("任務的開始時間:" + sdf.format(trigger.getStartTime())); System.out.println("任務的結束時間:" + sdf.format(trigger.getEndTime())); } }
cron表達式生成工具:http://www.bejson.com/othertools/cron/this
本教程重點講解StdSchedulerFactory,DirectSchedulerFactory自行了解spa
quartz.properties
public class MyJobListener implements JobListener { @Override public String getName() { // 監聽器名稱 String name = this.getClass().getName(); name = "監聽器的名稱是:" + name; return name; } @Override public void jobToBeExecuted(JobExecutionContext context) { System.out.println("Scheduler在JobDetail將要執行時調用的方法"); } @Override public void jobExecutionVetoed(JobExecutionContext context) { System.out.println("否決"); } @Override public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) { System.out.println("scheduler在job執行以後的監聽"); } }
public class HelloSchedulerDemoJobListener { public static void main(String[] args) throws SchedulerException, Exception { // 任務實例: JobDetail jobDetail = JobBuilder.newJob(HelloJobScheduler.class) .withIdentity("job1", "group1") .build(); // 觸發器: Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")// 參數1:設置觸發器名稱,參數2:設置觸發器組的名稱 .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?")).build(); // 讓調度器關聯任務和觸發器,保證按照觸發器定義的添加執行任務 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); Date scheduleJob = scheduler.scheduleJob(jobDetail, trigger); System.out.println("調度器的開始時間是:" + new SimpleDateFormat("yyyy-MM-dd HH:dd:ss").format(scheduleJob)); //建立並註冊一個全局的job listener // scheduler.getListenerManager().addJobListener(new MyJobListener(),EverythingMatcher.allJobs()); //建立並註冊一個局部的job listener scheduler.getListenerManager().addJobListener(new MyJobListener(),KeyMatcher.keyEquals(JobKey.jobKey("job1", "group1"))); scheduler.start(); } }
public class MyTriggerListener implements TriggerListener { @Override public String getName() { String name = this.getClass().getSimpleName(); System.out.println("觸發器的名稱:" + name); return name; } @Override public void triggerFired(Trigger trigger, JobExecutionContext context) { String triggerName = trigger.getKey().getName(); System.out.println("觸發器的名稱:" + triggerName + "被觸發了"); } @Override public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) { String triggerName = trigger.getKey().getName(); System.out.println("觸發器的名稱:" + triggerName + "沒有觸發"); return false;// true表示不會執行job的方法 } @Override public void triggerMisfired(Trigger trigger) { String triggerName = trigger.getKey().getName(); System.out.println("觸發器的名稱:" + triggerName + "錯過觸發"); } @Override public void triggerComplete(Trigger trigger, JobExecutionContext context, CompletedExecutionInstruction triggerInstructionCode) { String triggerName = trigger.getKey().getName(); System.out.println("觸發器的名稱:" + triggerName + "完成以後觸發"); } }
// 建立並註冊一個全局的trigger listener // scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(), EverythingMatcher.allTriggers()); // 建立並註冊一個局部的trigger listener scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(), KeyMatcher.keyEquals(TriggerKey.triggerKey("trigger1", "group1")));