quartz 2.2.3 自带示例源码解读example1~example5

    xiaoxiao2021-03-25  112

    目录(?)[+]

    Example1 第一个quartz示例

    [java] view plain copy public class HelloJob implements Job {            private static Logger _log = LoggerFactory.getLogger(HelloJob.class);        public HelloJob() {      }            @Override      public void execute(JobExecutionContext context)              throws JobExecutionException {          _log.info("Hello World! - " + new Date());      }  }      public class SimpleExample {      public void run() throws Exception {          Logger log = LoggerFactory.getLogger(SimpleExample.class);                    log.info("------- Initializing ----------------------");                    SchedulerFactory sf = new StdSchedulerFactory();          Scheduler sched = sf.getScheduler();                    log.info("------- Initialization Complete -----------");                    // 下一个整分钟          Date runTime = DateBuilder.evenMinuteDate(new Date());                    log.info("------- Scheduling Job  -------------------");                    JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1""group").build();          Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1""group1").startAt(runTime).build();          sched.scheduleJob(job, trigger);                    log.info(job.getKey() + " will run at: " + runTime);                    sched.start();                    log.info("------- Started Scheduler -----------------");          log.info("------- Waiting 65 seconds... -------------");                    try {              Thread.sleep(65L * 1000L);          } catch (InterruptedException e) {              e.printStackTrace();          }                    log.info("------- Shutting Down ---------------------");          sched.shutdown(true);          log.info("------- Shutdown Complete -----------------");      }            public static void main(String[] args) throws Exception {          SimpleExample example = new SimpleExample();          example.run();      }  }  

    Example2 简单触发器

    [java] view plain copy public class SimpleJob implements Job {      private static Logger _log = LoggerFactory.getLogger(SimpleJob.class);        public SimpleJob() {      }            @Override      public void execute(JobExecutionContext context)              throws JobExecutionException {          JobKey jobKey = context.getJobDetail().getKey();          _log.info("SimpleJob says: " + jobKey + " executing at " + new Date());      }  }      public class SimpleTriggerExample {      public void run() throws Exception {          Logger log = LoggerFactory.getLogger(SimpleTriggerExample.class);            log.info("------- Initializing -------------------");            // 得到调度器实例的引用          SchedulerFactory sf = new StdSchedulerFactory();          Scheduler sched = sf.getScheduler();            log.info("------- Initialization Complete --------");          log.info("------- Scheduling Jobs ----------------");            // jobs can be scheduled before sched.start() has been called            // 任务开始时间的秒数是15的倍数          Date startTime = DateBuilder.nextGivenSecondDate(null15);            // job1开始时间的秒数是15的倍数          JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("job1""group1").build();          SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()                  .withIdentity("trigger1""group1").startAt(startTime).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");            // job2开始时间的秒数是15的倍数          job = JobBuilder.newJob(SimpleJob.class).withIdentity("job2""group1").build();          trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity(                  "trigger2""group1").startAt(startTime).build();          ft = sched.scheduleJob(job, trigger);          log.info(job.getKey() + " will run at: " + ft + " and repeat: "                  + trigger.getRepeatCount() + " times, every "                  + trigger.getRepeatInterval() / 1000 + " seconds");            // job3开始时间的秒数是15的倍数(运行一次,重复10次,共11次,每次运行间隔为10s)          job = JobBuilder.newJob(SimpleJob.class).withIdentity("job3""group1").build();          trigger = TriggerBuilder.newTrigger()                  .withIdentity("trigger3""group1").startAt(startTime)                  .withSchedule(                          SimpleScheduleBuilder.simpleSchedule()                                  .withIntervalInSeconds(10).withRepeatCount(10))                  .build();          ft = sched.scheduleJob(job, trigger);          log.info(job.getKey() + " will run at: " + ft + " and repeat: "                  + trigger.getRepeatCount() + " times, every "                  + trigger.getRepeatInterval() / 1000 + " seconds");                      // 相同的job3开始时间的秒数是15的倍数(运行一次,重复2次,共3次,每次运行间隔为10s)          trigger = TriggerBuilder.newTrigger()                  .withIdentity("trigger3""group2").startAt(startTime)                  .withSchedule(                          SimpleScheduleBuilder.simpleSchedule()                                  .withIntervalInSeconds(10).withRepeatCount(2))                  .forJob(job).build();          ft = sched.scheduleJob(trigger);          log.info(job.getKey() + " will [also] run at: " + ft + " and repeat: "                  + trigger.getRepeatCount() + " times, every "                  + trigger.getRepeatInterval() / 1000 + " seconds");            // job4开始时间的秒数是15的倍数(运行一次,重复5次,共6次,每次运行间隔为10s)          job = JobBuilder.newJob(SimpleJob.class).withIdentity("job4""group1").build();          trigger = TriggerBuilder.newTrigger().withIdentity("trigger4""group1").startAt(                  startTime).withSchedule(                          SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).withRepeatCount(5))                  .build();          ft = sched.scheduleJob(job, trigger);          log.info(job.getKey() + " will run at: " + ft + " and repeat: "                  + trigger.getRepeatCount() + " times, every "                  + trigger.getRepeatInterval() / 1000 + " seconds");            // job5会立即调度,运行时间在5分钟后          job = JobBuilder.newJob(SimpleJob.class).withIdentity("job5""group1").build();          trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger5",                  "group1").startAt(DateBuilder.futureDate(5, IntervalUnit.MINUTE)).build();          ft = sched.scheduleJob(job, trigger);          log.info(job.getKey() + " will run at: " + ft + " and repeat: "                  + trigger.getRepeatCount() + " times, every "                  + trigger.getRepeatInterval() / 1000 + " seconds");            // job6开始时间的秒数是15的倍数,并且每40秒会重复运行一次,无限重复          job = JobBuilder.newJob(SimpleJob.class).withIdentity("job6""group1").build();          trigger = TriggerBuilder.newTrigger().withIdentity("trigger6""group1").startAt(                  startTime).withSchedule(                          SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(40).repeatForever())                  .build();          ft = sched.scheduleJob(job, trigger);          log.info(job.getKey() + " will run at: " + ft + " and repeat: "                  + trigger.getRepeatCount() + " times, every "                  + trigger.getRepeatInterval() / 1000 + " seconds");            log.info("------- Starting Scheduler ----------------");            // 所有的任务已加入调度器,但调度器未开始之前所有的任务都不会运行          sched.start();          log.info("------- Started Scheduler -----------------");          // 调度器运行后任务仍然可以被调度                    // job7开始时间的秒数是15的倍数,并且每5分钟会重复运行一次,重复20次          job = JobBuilder.newJob(SimpleJob.class).withIdentity("job7""group1").build();          trigger = TriggerBuilder.newTrigger().withIdentity("trigger7""group1").startAt(                  startTime).withSchedule(                          SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(5).withRepeatCount(20))                  .build();          ft = sched.scheduleJob(job, trigger);          log.info(job.getKey() + " will run at: " + ft + " and repeat: "                  + trigger.getRepeatCount() + " times, every "                  + trigger.getRepeatInterval() / 1000 + " seconds");            // job8可以直接运行,而不使用触发器          job = JobBuilder.newJob(SimpleJob.class).withIdentity("job8""group1")                  .storeDurably().build();          sched.addJob(job, true);          log.info("'Manually' triggering job8...");          sched.triggerJob(JobKey.jobKey("job8""group1"));            log.info("------- Waiting 30 seconds... --------------");            try {              Thread.sleep(30L * 1000L);          } catch (Exception e) {              e.printStackTrace();          }            // job7可以重复调度,开始时间的秒数是15的倍数,并且每5分钟会重复运行一次,重复20次          log.info("------- Rescheduling... --------------------");          trigger = TriggerBuilder.newTrigger().withIdentity("trigger7""group1").startAt(                  startTime).withSchedule(                          SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(5).withRepeatCount(20))                  .build();            ft = sched.rescheduleJob(trigger.getKey(), trigger);          log.info("job7 rescheduled to run at: " + ft);            log.info("------- Waiting five minutes... ------------");          try {              // 等待5分钟              Thread.sleep(300L * 1000L);          } catch (Exception e) {              e.printStackTrace();          }            log.info("------- Shutting Down ---------------------");            sched.shutdown(true);            log.info("------- Shutdown Complete -----------------");            // 显示调度器的状态          SchedulerMetaData metaData = sched.getMetaData();          log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");      }        public static void main(String[] args) throws Exception {          SimpleTriggerExample example = new SimpleTriggerExample();          example.run();      }  }  

    Example 3 crontab格式的触发器

    [java] view plain copy public class SimpleJob implements Job {        private static Logger _log = LoggerFactory.getLogger(SimpleJob.class);        public SimpleJob() {      }        public void execute(JobExecutionContext context)              throws JobExecutionException {          // 打印job的名称和运行时间          JobKey jobKey = context.getJobDetail().getKey();          _log.info("SimpleJob says: " + jobKey + " executing at " + new Date());      }  }      public class CronTriggerExample {      public void run() throws Exception {      Logger log = LoggerFactory.getLogger(CronTriggerExample.class);        log.info("------- Initializing -------------------");        // 得到调度器的引用      SchedulerFactory sf = new StdSchedulerFactory();      Scheduler sched = sf.getScheduler();        log.info("------- Initialization Complete --------");        log.info("------- Scheduling Jobs ----------------");        // job可以在调度器运行前被调度        // job 1 每20秒运行1次      JobDetail job = newJob(SimpleJob.class).withIdentity("job1""group1").build();      CronTrigger trigger = newTrigger().withIdentity("trigger1""group1").withSchedule(cronSchedule("0/20 * * * * ?"))          .build();      Date ft = sched.scheduleJob(job, trigger);      log.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: "               + trigger.getCronExpression());        // job 2 在偶数分钟的第15秒运行      job = newJob(SimpleJob.class).withIdentity("job2""group1").build();      trigger = newTrigger().withIdentity("trigger2""group1").withSchedule(cronSchedule("15 0/2 * * * ?")).build();      ft = sched.scheduleJob(job, trigger);      log.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: "               + trigger.getCronExpression());        // job 3 在8-17点的偶数分钟运行      job = newJob(SimpleJob.class).withIdentity("job3""group1").build();      trigger = newTrigger().withIdentity("trigger3""group1").withSchedule(cronSchedule("0 0/2 8-17 * * ?")).build();      ft = sched.scheduleJob(job, trigger);      log.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: "               + trigger.getCronExpression());        // job 4 在17-23点分钟是3的倍数运行      job = newJob(SimpleJob.class).withIdentity("job4""group1").build();      trigger = newTrigger().withIdentity("trigger4""group1").withSchedule(cronSchedule("0 0/3 17-23 * * ?")).build();      ft = sched.scheduleJob(job, trigger);      log.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: "               + trigger.getCronExpression());        // job 5 在每月1号或15号的10点运行      job = newJob(SimpleJob.class).withIdentity("job5""group1").build();      trigger = newTrigger().withIdentity("trigger5""group1").withSchedule(cronSchedule("0 0 10am 1,15 * ?")).build();      ft = sched.scheduleJob(job, trigger);      log.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: "               + trigger.getCronExpression());        // job 6 周一至周五的每30秒运行一次      job = newJob(SimpleJob.class).withIdentity("job6""group1").build();      trigger = newTrigger().withIdentity("trigger6""group1").withSchedule(cronSchedule("0,30 * * ? * MON-FRI"))          .build();      ft = sched.scheduleJob(job, trigger);      log.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: "               + trigger.getCronExpression());        // job 7 在周六、周日的每30秒运行一次      job = newJob(SimpleJob.class).withIdentity("job7""group1").build();      trigger = newTrigger().withIdentity("trigger7""group1").withSchedule(cronSchedule("0,30 * * ? * SAT,SUN"))          .build();      ft = sched.scheduleJob(job, trigger);      log.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: "               + trigger.getCronExpression());        log.info("------- Starting Scheduler ----------------");        // 调度器运行前所有任务不会运行      sched.start();        log.info("------- Started Scheduler -----------------");        log.info("------- Waiting five minutes... ------------");      try {        Thread.sleep(300L * 1000L);      } catch (Exception e) {        e.printStackTrace();      }        log.info("------- Shutting Down ---------------------");        sched.shutdown(true);        log.info("------- Shutdown Complete -----------------");        SchedulerMetaData metaData = sched.getMetaData();      log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");      }      public static void main(String[] args) throws Exception {        CronTriggerExample example = new CronTriggerExample();      example.run();    }    }  

    Example4 向任务传递参数

    [java] view plain copy // 接收参数和维护状态的示例,注意这两个注解  @PersistJobDataAfterExecution   // 每次执行后会持久化JobData  @DisallowConcurrentExecution    // 不允许并发执行  public class ColorJob implements Job {        private static Logger _log = LoggerFactory.getLogger(ColorJob.class);            // 静态参数      public static final String FAVORITE_COLOR = "favorite color";      public static final String EXECUTION_COUNT = "count";            // 因为quartz每次执行任务时都会重新实例化一个类,所以非静态成员变量不能用来维护状态      private int _counter = 1;        public ColorJob() {      }        public void execute(JobExecutionContext context)          throws JobExecutionException {          // 获取jobkey类似group1.job1          JobKey jobKey = context.getJobDetail().getKey();                    // 获取并打印传递过来的参数          JobDataMap data = context.getJobDetail().getJobDataMap();          String favoriteColor = data.getString(FAVORITE_COLOR);          int count = data.getInt(EXECUTION_COUNT);          _log.info("ColorJob: " + jobKey + " executing at " + new Date() + "\n" +              "  favorite color is " + favoriteColor + "\n" +               "  execution count (from job map) is " + count + "\n" +               "  execution count (from job member variable) is " + _counter);                    // 增加count并保存到job的map中,所以job状态可以维护          count++;          data.put(EXECUTION_COUNT, count);                    // 增加本地成员变量,通过成员变量不能维护job状态          _counter++;      }  }        public class JobStateExample {        public void run() throws Exception {          Logger log = LoggerFactory.getLogger(JobStateExample.class);            log.info("------- Initializing -------------------");            // 得到调度器的引用          SchedulerFactory sf = new StdSchedulerFactory();          Scheduler sched = sf.getScheduler();            log.info("------- Initialization Complete --------");            log.info("------- Scheduling Jobs ----------------");            // 开始时间秒数是10的倍数          Date startTime = nextGivenSecondDate(null10);            // job1 会在秒数是10的倍数开始,重复4次,每10秒重复1次          JobDetail job1 = newJob(ColorJob.class).withIdentity("job1""group1")                  .build();          SimpleTrigger trigger1 = newTrigger()                  .withIdentity("trigger1""group1").startAt(startTime)                  .withSchedule(                          simpleSchedule().withIntervalInSeconds(10)                                  .withRepeatCount(4)).build();          // 向 job1 传递参数          job1.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Green");          job1.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);          Date scheduleTime1 = sched.scheduleJob(job1, trigger1);          log.info(job1.getKey() + " will run at: " + scheduleTime1                  + " and repeat: " + trigger1.getRepeatCount()                  + " times, every " + trigger1.getRepeatInterval() / 1000                  + " seconds");            // job2 会在秒数是10的倍数开始,重复4次,每10秒重复1次          JobDetail job2 = newJob(ColorJob.class).withIdentity("job2""group1")                  .build();          SimpleTrigger trigger2 = newTrigger()                  .withIdentity("trigger2""group1").startAt(startTime)                  .withSchedule(                          simpleSchedule().withIntervalInSeconds(10)                                  .withRepeatCount(4)).build();          // 向 job2传递参数          job2.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Red");          job2.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);          Date scheduleTime2 = sched.scheduleJob(job2, trigger2);          log.info(job2.getKey().toString() + " will run at: " + scheduleTime2                  + " and repeat: " + trigger2.getRepeatCount()                  + " times, every " + trigger2.getRepeatInterval() / 1000                  + " seconds");            log.info("------- Starting Scheduler ----------------");            // 所有的任务已加入调度器,但调度器未开始之前所有的任务都不会运行          sched.start();            log.info("------- Started Scheduler -----------------");            log.info("------- Waiting 60 seconds... -------------");          try {              Thread.sleep(60L * 1000L);          } catch (Exception e) {              //          }            log.info("------- Shutting Down ---------------------");            sched.shutdown(true);            log.info("------- Shutdown Complete -----------------");            SchedulerMetaData metaData = sched.getMetaData();          log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");        }        public static void main(String[] args) throws Exception {            JobStateExample example = new JobStateExample();          example.run();      }    }  

    Example5 错失任务执行策略

    [java] view plain copy /**  * 一个哑任务,用于单元测试  */  @PersistJobDataAfterExecution  @DisallowConcurrentExecution  public class StatefulDumbJob implements Job {      // 常量      public static final String NUM_EXECUTIONS = "NumExecutions";      public static final String EXECUTION_DELAY = "ExecutionDelay";        public StatefulDumbJob() {      }        public void execute(JobExecutionContext context)              throws JobExecutionException {          System.err.println("---" + context.getJobDetail().getKey()                  + " executing.[" + new Date() + "]");            // 取出job中的map中的数据,增加并重新放入job的map中          JobDataMap map = context.getJobDetail().getJobDataMap();          int executeCount = 0;          if (map.containsKey(NUM_EXECUTIONS)) {              executeCount = map.getInt(NUM_EXECUTIONS);          }          executeCount++;          map.put(NUM_EXECUTIONS, executeCount);            // 如果包含延迟字段,则模拟任务延迟5秒          long delay = 5000l;          if (map.containsKey(EXECUTION_DELAY)) {              delay = map.getLong(EXECUTION_DELAY);          }          try {              Thread.sleep(delay);          } catch (Exception ignore) {          }                    // 完成任务,打印完成语句          System.err.println("  -" + context.getJobDetail().getKey()                  + " complete (" + executeCount + ").");      }  }        public class MisfireExample {        public void run() throws Exception {          Logger log = LoggerFactory.getLogger(MisfireExample.class);            log.info("------- Initializing -------------------");          // 得到调度器的引用          SchedulerFactory sf = new StdSchedulerFactory();          Scheduler sched = sf.getScheduler();            log.info("------- Initialization Complete -----------");          log.info("------- Scheduling Jobs -----------");            // 开始时间秒数是15的倍数          Date startTime = nextGivenSecondDate(null15);            // 有状态job1每3秒运行1次,但会延迟10秒(任务中睡眠了10秒模拟了执行任务需要10秒)          JobDetail job = newJob(StatefulDumbJob.class).withIdentity(                  "statefulJob1""group1").usingJobData(                  StatefulDumbJob.EXECUTION_DELAY, 10000L).build();          SimpleTrigger trigger = newTrigger().withIdentity("trigger1""group1")                  .startAt(startTime).withSchedule(                          simpleSchedule().withIntervalInSeconds(3)                                  .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");            // 有状态job2每3秒运行1次,但会延迟10秒(任务中睡眠了10秒模拟了执行任务需要10秒)          // job2设置了策略,所以错失后会立即触发,而不会等到下一个触发点          job = newJob(StatefulDumbJob.class).withIdentity("statefulJob2",                  "group1").usingJobData(StatefulDumbJob.EXECUTION_DELAY, 10000L)                  .build();          trigger = newTrigger().withIdentity("trigger2""group1").startAt(                  startTime).withSchedule(                  simpleSchedule().withIntervalInSeconds(3).repeatForever()                  // 设置错失触发后的调度策略                          .withMisfireHandlingInstructionNowWithExistingCount())                  .build();          ft = sched.scheduleJob(job, trigger);          log.info(job.getKey() + " will run at: " + ft + " and repeat: "                  + trigger.getRepeatCount() + " times, every "                  + trigger.getRepeatInterval() / 1000 + " seconds");            log.info("------- Starting Scheduler ----------------");          sched.start();          log.info("------- Started Scheduler -----------------");            try {              Thread.sleep(600L * 1000L);          } catch (Exception e) {          }            log.info("------- Shutting Down ---------------------");          sched.shutdown(true);          log.info("------- Shutdown Complete -----------------");            SchedulerMetaData metaData = sched.getMetaData();          log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");      }        public static void main(String[] args) throws Exception {          MisfireExample example = new MisfireExample();          example.run();      }        //本范例中,触发的间隔被设置为3秒,但是由于任务体执行间睡眠10秒,导致了错失触发的产生。      //实际运行的效果,2个任务执行的间隔为10秒。      //由于丢失触发时,job2的策略是立即触发,而job1是等待下一次机会触发。所以job2会赶在job1的前头,最终运行次数大于job1。  } 
    转载请注明原文地址: https://ju.6miu.com/read-22505.html

    最新回复(0)