quartz基本介紹

  • Quartz基本介紹

    • 簡介

      Quartz是一個功能強大的開源任務調度框架,幾乎能夠繼承到任何java應用程序。Quartz能夠用來建立簡單或爲運行十個,百個,甚至是好幾萬個Jobs這樣複雜的程序。同時Quartz Scheduler包含許多企業級功能,例如對JTA事務和集羣的支持java

    • 簡單實例

      該實例用來在下一分鐘執行一個helloJobgit

      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的基本步驟,即包括:github

      一、建立SchedulerFactory工廠對象,並從中獲取一個Schedulerspring

      二、建立一個JobDetail框架

      三、建立一個觸發器即Triggeride

      四、註冊到Scheduler,即scheduler.scheduleJob(job, trigger);ui

      五、啓動Scheduler,即scheduler.start();線程

    • 核心類與接口

      Job:是一個接口,裏面有一個方法public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException,開發者在開發調度任務的時候,只須要實現該接口便可。JobExecutionContext類提供了調度上下文的各類信息。Job運行時的信息保存在JobDataMap,也能夠保存在SchedulerContext中。code

      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

相關文章
相關標籤/搜索