任务类
1 package org.quartz.examples.example2; 2 3 import java.util.Date; 4 5 import org.slf4j.Logger; 6 import org.slf4j.LoggerFactory; 7 import org.quartz.Job; 8 import org.quartz.JobExecutionContext; 9 import org.quartz.JobExecutionException; 10 import org.quartz.JobKey; 11 12 /** 13 * 任务job 14 */ 15 public class SimpleJob implements Job { 16 17 private static Logger LOG = LoggerFactory.getLogger(SimpleJob.class); 18 19 // 必须要有public修饰的无参构造函数 20 public SimpleJob() { 21 } 22 23 // 任务执行方法 24 public void execute(JobExecutionContext context) throws JobExecutionException { 25 JobKey jobKey = context.getJobDetail().getKey(); //jobKey长这样:group1.job6 26 LOG.info("执行任务。SimpleJob says: " + jobKey + " executing at " + new Date()); 27 } 28 29 }
调度管理类
1 package org.quartz.examples.example2; 2 3 import static org.quartz.DateBuilder.futureDate; 4 import static org.quartz.JobBuilder.newJob; 5 import static org.quartz.JobKey.jobKey; 6 import static org.quartz.SimpleScheduleBuilder.simpleSchedule; 7 import static org.quartz.TriggerBuilder.newTrigger; 8 9 import org.quartz.DateBuilder; 10 import org.quartz.DateBuilder.IntervalUnit; 11 import org.quartz.JobDetail; 12 import org.quartz.Scheduler; 13 import org.quartz.SchedulerException; 14 import org.quartz.SchedulerFactory; 15 import org.quartz.SchedulerMetaData; 16 import org.quartz.SimpleTrigger; 17 import org.quartz.impl.StdSchedulerFactory; 18 import org.slf4j.Logger; 19 import org.slf4j.LoggerFactory; 20 21 import java.util.Date; 22 23 /** 24 * 这个例子表明,只要触发器运用的好,job任务可以被花式执行 25 */ 26 public class SimpleTriggerExample { 27 Logger LOG = LoggerFactory.getLogger(SimpleTriggerExample.class); 28 29 public void run() throws Exception { 30 31 // 初始化一个调度工厂,并实例化一个调度类 32 SchedulerFactory sf = new StdSchedulerFactory(); 33 Scheduler scheduler = sf.getScheduler(); 34 // 四舍五入的日期,如果为空,则使用当前时间 35 Date startTime = DateBuilder.nextGivenSecondDate(null, 15); 36 37 // ======================================================== 38 // ============ job1 任务绑定到group1 组中 ================== 39 // ======================================================== 40 JobDetail job = newJob(SimpleJob.class).withIdentity("job1", "group1").build(); 41 // 实例化一个触发器,命名为trigger1,并绑定到一个名为group1的组中,Job类运行开始时间为runTime(下一分钟) 42 SimpleTrigger trigger = (SimpleTrigger) newTrigger().withIdentity("trigger1", "group1").startAt(startTime) 43 .build(); 44 Date date = scheduler.scheduleJob(job, trigger); 45 LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every " 46 + trigger.getRepeatInterval() / 1000 + " seconds"); 47 48 // ======================================================== 49 // ============ job2 任务绑定到group1 组中 ================== 50 // ======================================================== 51 job = newJob(SimpleJob.class).withIdentity("job2", "group1").build(); 52 trigger = (SimpleTrigger) newTrigger().withIdentity("trigger2", "group1").startAt(startTime).build(); 53 date = scheduler.scheduleJob(job, trigger); 54 LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every " 55 + trigger.getRepeatInterval() / 1000 + " seconds"); 56 57 // ==================================================================== 58 // ============ job3 任务绑定到group1 组中,运行一次每间隔10秒重复1次,总共重复10次 59 // ==================================================================== 60 job = newJob(SimpleJob.class).withIdentity("job3", "group1").build(); 61 trigger = newTrigger().withIdentity("trigger3", "group1").startAt(startTime) 62 .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10)).build(); 63 date = scheduler.scheduleJob(job, trigger); 64 LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every " 65 + trigger.getRepeatInterval() / 1000 + " seconds"); 66 // ==================================================================== 67 // ============ job3 任务绑定到group2 组中,将被另一个触发器调度,这一次将以70秒的间隔重复两次 68 // ==================================================================== 69 trigger = newTrigger().withIdentity("trigger3", "group2").startAt(startTime) 70 .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(2)).forJob(job).build(); 71 72 date = scheduler.scheduleJob(trigger); 73 LOG.info(job.getKey() + " will [also] run at: " + date + " and repeat: " + trigger.getRepeatCount() 74 + " times, every " + trigger.getRepeatInterval() / 1000 + " seconds"); 75 76 // ==================================================================== 77 // ============ job4 将被执行6次,执行一次重复5次,每次间隔10秒 78 // ==================================================================== 79 job = newJob(SimpleJob.class).withIdentity("job4", "group1").build(); 80 trigger = newTrigger().withIdentity("trigger4", "group1").startAt(startTime) 81 .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(5)).build(); 82 date = scheduler.scheduleJob(job, trigger); 83 LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every " 84 + trigger.getRepeatInterval() / 1000 + " seconds"); 85 86 // ==================================================================== 87 // ============ job5 将在5分钟后执行一次 88 // ==================================================================== 89 job = newJob(SimpleJob.class).withIdentity("job5", "group1").build(); 90 trigger = (SimpleTrigger) newTrigger().withIdentity("trigger5", "group1") 91 .startAt(futureDate(5, IntervalUnit.MINUTE)).build(); 92 date = scheduler.scheduleJob(job, trigger); 93 LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every " 94 + trigger.getRepeatInterval() / 1000 + " seconds"); 95 96 // ==================================================================== 97 // ============ job6 将被无限期地执行,每隔40秒执行一次 98 // ==================================================================== 99 job = newJob(SimpleJob.class).withIdentity("job6", "group1").build(); 100 trigger = newTrigger().withIdentity("trigger6", "group1").startAt(startTime) 101 .withSchedule(simpleSchedule().withIntervalInSeconds(40).repeatForever()).build(); 102 date = scheduler.scheduleJob(job, trigger); 103 LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every " 104 + trigger.getRepeatInterval() / 1000 + " seconds"); 105 106 // ==================================================================== 107 // ============ 启动调度器 108 // ==================================================================== 109 scheduler.start(); 110 111 // ==================================================================== 112 // ============ 在调度器启动之后,新增加的job7仍将可以被调度,job7将5分钟执行一次,总共重复20次 113 // ==================================================================== 114 job = newJob(SimpleJob.class).withIdentity("job7", "group1").build(); 115 trigger = newTrigger().withIdentity("trigger7", "group1").startAt(startTime) 116 .withSchedule(simpleSchedule().withIntervalInMinutes(5).withRepeatCount(20)).build(); 117 date = scheduler.scheduleJob(job, trigger); 118 LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every " 119 + trigger.getRepeatInterval() / 1000 + " seconds"); 120 121 // ==================================================================== 122 // ============ job8绑定到group1,只有定义好触发器,才会被执行 123 // ==================================================================== 124 job = newJob(SimpleJob.class).withIdentity("job8", "group1").storeDurably().build(); 125 scheduler.addJob(job, true); // job添加到任务调度器 126 scheduler.triggerJob(jobKey("job8", "group1")); // 手动触发job8,绑定到group1 127 128 try { 129 Thread.sleep(30L * 1000L); // 等待30秒,让任务都执行完毕 130 } catch (Exception e) { 131 } 132 133 // 停止调度器 134 scheduler.shutdown(true); 135 136 // 显示调度器的一些统计信息 137 SchedulerMetaData metaData = scheduler.getMetaData(); 138 LOG.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs."); 139 140 } 141 142 // 演示触发器被重新调度案例 143 private void rescheduleJobDemo() throws SchedulerException { 144 // 初始化一个调度工厂,并实例化一个调度类 145 SchedulerFactory sf = new StdSchedulerFactory(); 146 Scheduler scheduler = sf.getScheduler(); 147 // 四舍五入的日期,如果为空,则使用当前时间 148 Date startTime = DateBuilder.nextGivenSecondDate(null, 15); 149 150 // ==================================================================== 151 // ============ job600 将被无限期地执行,每隔5秒执行一次,由trigger2019触发 152 // ==================================================================== 153 JobDetail job = newJob(SimpleJob.class).withIdentity("job600", "group1").build(); 154 SimpleTrigger trigger = newTrigger().withIdentity("trigger2019", "group1").startAt(startTime) 155 .withSchedule(simpleSchedule().withIntervalInSeconds(5).repeatForever()).build(); 156 Date date = scheduler.scheduleJob(job, trigger); 157 LOG.info(job.getKey() + " will run at: " + date + " and repeat: " + trigger.getRepeatCount() + " times, every " 158 + trigger.getRepeatInterval() / 1000 + " seconds"); 159 // ==================================================================== 160 // ============ 启动调度器 161 // ==================================================================== 162 scheduler.start(); 163 164 try { 165 System.out.println("线程进入睡眠"); 166 Thread.sleep(10000); 167 } catch (InterruptedException e) { 168 e.printStackTrace(); 169 } 170 System.out.println("线程被唤醒"); 171 // ==================================================================== 172 // ============ job600 被重新定义的trigger2019触发器重新调度,改为每1秒钟执行一次 173 // ==================================================================== 174 SimpleTrigger trigger2 = newTrigger().withIdentity("trigger2019", "group1").startAt(startTime) 175 .withSchedule(simpleSchedule().withIntervalInSeconds(1).repeatForever()).build(); 176 Date date2 = scheduler.rescheduleJob(trigger2.getKey(), trigger2); 177 LOG.info("job600 rescheduled to run at: " + date2); 178 } 179 180 public static void main(String[] args) throws Exception { 181 SimpleTriggerExample example = new SimpleTriggerExample(); 182 example.run(); 183 example.rescheduleJobDemo(); //重新调度案例 184 } 185 186 }