quartz基本介绍

  • Quartz基本介绍

    • 简介

      Quartz是一个功能强大的开源任务调度框架,几乎可以继承到任何java应用程序。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。同时Quartz Scheduler包含许多企业级功能,例如对JTA事务和集群的支持

    • 简单实例

      该实例用来在下一分钟执行一个helloJob

      public class HelloJobMain {
      
          public static void main(String[] args) throws Exception {
            //  DirectSchedulerFactory directSchedulerFactory =  DirectSchedulerFactory.getInstance();
      
              //创建一个调度工厂对象,并从里面获取一个调度器
              SchedulerFactory schedulerFactory = new StdSchedulerFactory();
              Scheduler scheduler = schedulerFactory.getScheduler();
      
      
              //获取当前时间的下一分钟
              Date runTime = DateBuilder.evenMinuteDate(new Date());
              //定义一个job jobkey名称 jobkey 组
              JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();
      
              JobDataMap jobDataMap = job.getJobDataMap();
              //JobDataMap jobDataMap=new JobDataMap();
              jobDataMap.put("zhangsan",23);
      
              //定义一个定时器
              Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();
      
              scheduler.getContext().put("lisi",24);
      
              scheduler.scheduleJob(job, trigger);
      
              scheduler.start();
      
      
              Thread.sleep(65L * 1000L);
      
              scheduler.shutdown(true);
      
          }
      }
      
      public class HelloJob implements Job {
          /**
           * @param jobExecutionContext
           * @throws JobExecutionException
           */
          @Override
          public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
              System.out.println("HelloJob 任务执行啦");
      
              JobDetail jobDetail = jobExecutionContext.getJobDetail();
              JobKey key = jobDetail.getKey();
              Trigger trigger = jobExecutionContext.getTrigger();
              TriggerKey key1 = trigger.getKey();
      
              JobDataMap mergedJobDataMap = jobExecutionContext.getMergedJobDataMap();
              System.out.println(mergedJobDataMap.get("zhangsan"));
      
              SchedulerContext context = null;
              try {
                  context = jobExecutionContext.getScheduler().getContext();
              } catch (SchedulerException e) {
                  e.printStackTrace();
              }
              System.out.println(context.get("lisi"));
      
      
          }
      }

      上面代码是创建一个Job的基本步骤,即包括:

      1、创建SchedulerFactory工厂对象,并从中获取一个Scheduler

      2、创建一个JobDetail

      3、创建一个触发器即Trigger

      4、注册到Scheduler,即scheduler.scheduleJob(job, trigger);

      5、启动Scheduler,即scheduler.start();

    • 核心类与接口

      Job:是一个接口,里面有一个方法public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException,开发者在开发调度任务的时候,只需要实现该接口即可。JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap,也可以保存在SchedulerContext中。

      JobDetail:传递给定Job实例的详细信息,包括Job名字以及所属的组

      Trigger:触发Job执行的时间的规则。主要有CalendarIntervalTrigger,CronTrigger,DailyTimeIntervalTrigger,SimpleTrigger,常用的有SimpleTrigger和CronTrigger两个。

      ​ CalendarIntervalTrigger:按照固定的时间间隔来触发任务。比如:使用月作为间隔单位,不小心设置为月底的最后一天,比如1月31号,Trigger的Unit为month,interval是1,则下一个触发为2月28号,之后再次触发为3月28号,依次类推。

      ​ DailyTimeIntervalTrigger:跟CalendarIntervalTrigger类似,比如:Trigger设置在8:00~11:00之间,每72分钟执行一次,则执行时间为8:00, 9:12, 10:24,下次执行时间为第二天的8:00, 9:12, 10:24。

      ​ CronTrigger:按照Cron表达式给定的时间触发任务

      ​ SimpleTrigger:用来触发只需执行一次或者在给定时间触发并且重复N次且每次执行延迟一定时间的任务。

      Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,两者在Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法,允许外部通过组及名称访问和控制容器中Trigger和JobDetail。

      ThreadPool:Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。
      JobStore: 通过类实现的接口,这些类要为org.quartz.core.QuartzScheduler的使用提供一个org.quartz.Job和org.quartz.Trigger存储机制。作业和触发器的存储应该以其名称和组的组合为唯一性。
      QuartzSchedulerResources:包含创建QuartzScheduler实例所需的所有资源(JobStore,ThreadPool等)。
      SchedulerFactory :提供用于获取调度程序实例的客户端可用句柄的机制
      QuartzSchedulerThread:负责执行向QuartzScheduler注册的触发Trigger的工作的线程。

    • Cron表达式

      结构: corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份

      字段 允许值 允许特殊字符
      Seconds 0-59 , - * /
      Minutes 0-59 , - * /
      Hours 0-23 , - * /
      Day-of-month 1-31 , - * ? / L W
      Month 0-11 or JAN-DEC , - * /
      Day-of-Week 1-7 or SUN-SAT , - * ? / L #
      Year (Optional) empty, 1970-2199 , - * /

      *号:代表任意的值,比如:在minutes代表任意每一分钟

      ?号:用于day-of-month 和 day-of-week,表示不匹配任何值

      -号:比如用在hour字段,10-12 表示匹配10,11,12

      ,号:表示枚举值,比如在day-of-week:MON,WED,FRI代表Monday, Wednesday, 和Friday

      /号: 表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.

      L号:表示最后,用在day-of-month 和day-of-week, 如果在day-of-week域使用5L,意味着在最后的一个星期四触发。

      W号:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。

      LW号:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。

      #号:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。

      表达式 含义
      0 0 12 * * ? 表示每天12点执行
      0 15 10 ? * * 每天10:15am执行
      0 15 10 * * ? 每天10:15am执行
      0 15 10 * * ? * 每天10:15am执行
      0 15 10 * * ? 2005 2005年每天10:15am执行
      0 * 14 * * ? 每天从2:00pm到2:59pm每分钟执行
      0 0/5 14 * * ? 每天从2:00pm到2:59pm每5分钟执行
      0 0/5 14,18 * * ? 每天2:00pm到2:59pm和6:00pm到6:59pm,每5分钟执行一次
      0 0-5 14 * * ? 每天2:00pm到2:05pm每分钟执行
      0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
      0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
      0 15 10 15 * ? 每月15日上午10:15触发
      0 15 10 L * ? 每月最后一日的上午10:15触发
      0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
      0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
      0 15 10 ? * 6#3 每月的第三个周五上午10:15触发

相关源码参考: https://github.com/albert-liu435/springquartz

你可能感兴趣的:(quartz基本介绍)