<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    午后星期午

    框架Quart在Java中任務調度的使用

    Quartz框架是一個全功能、開源的任務調度服務,可以集成幾乎任何的java應用程序—從小的單片機系統到大型的電子商務系統。Quartz可以執行上千上萬的任務調度。

      核心概念

      Quartz核心的概念:scheduler任務調度、Job任務、Trigger觸發器、JobDetail任務細節

      Job任務:其實Job是接口,其中只有一個execute方法:

      package org.quartz;

      public abstract interface Job

      {

      public abstract void execute(JobExecutionContext paramJobExecutionContext)

      throws JobExecutionException;

      }

      我們開發者只要實現此接口,實現execute方法即可。把我們想做的事情,在execute中執行即可。

      JobDetail:任務細節,Quartz執行Job時,需要新建個Job實例,但是不能直接操作Job類,所以通過JobDetail來獲取Job的名稱、描述信息。

      Trigger觸發器:執行任務的規則;比如每天,每小時等。

      一般情況使用SimpleTrigger,和CronTrigger,這個觸發器實現了Trigger接口。

      對于復雜的時間表達式來說,比如每個月15日上午幾點幾分,使用CronTrigger

      對于簡單的時間來說,比如每天執行幾次,使用SimpleTrigger

      scheduler任務調度:是最核心的概念,需要把JobDetail和Trigger注冊到scheduler中,才可以執行。

      注意:

      不同的版本的jar包,具體的操作不太相同,但是tbw思路是相同的;比如1.8.6jar包中,JobDetail是個類,直接通過構造方法與Job類關聯。SimpleTrigger和 CornTrigger是類;在2.0.2jar包中,JobDetail是個接口,SimpleTrigger和CornTrigger是接口

      不同版本測試:

      1.8.6jar包:
      package com.test;

      import java.util.Date;

      import org.quartz.Job;

      import org.quartz.JobExecutionContext;

      import org.quartz.JobExecutionException;

      /**

      * 需要執行的任務

      * @author lhy

      *

      */

      public class MyJob implements Job {

      @Override

      //把要執行的操作,寫在execute方法中

      public void execute(JobExecutionContext arg0) throws JobExecutionException {

      System.out.println("測試Quartz"+new Date());

      }

      }
        
         使用SimpleTrigger觸發器
      package com.test;

      import java.util.Date;

      import org.quartz.JobDetail;

      import org.quartz.Scheduler;

      import org.quartz.SchedulerException;

      import org.quartz.SchedulerFactory;

      import org.quartz.SimpleTrigger;

      import org.quartz.impl.StdSchedulerFactory;

      /**

      * 調用任務的類

      * @author lhy

      *

      */

      public class SchedulerTest {

      public static void main(String[] args) {

      //通過schedulerFactory獲取一個調度器

      SchedulerFactory schedulerfactory=new StdSchedulerFactory();

      Scheduler scheduler=null;

      try{

      // 通過schedulerFactory獲取一個調度器

      scheduler=schedulerfactory.getScheduler();

      // 創建jobDetail實例,綁定Job實現類

      // 指明job的名稱,所在組的名稱,以及綁定job類

      JobDetail jobDetail=new JobDetail("job1", "jgroup1", MyJob.class);

      // 定義調度觸發規則,比如每1秒運行一次,共運行8次

      SimpleTrigger simpleTrigger=new SimpleTrigger("simpleTrigger","triggerGroup");

      // 馬上啟動

      simpleTrigger.setStartTime(new Date());

      // 間隔時間

      simpleTrigger.setRepeatInterval(1000);

      // 運行次數

      simpleTrigger.setRepeatCount(8);

      // 把作業和觸發器注冊到任務調度中

      scheduler.scheduleJob(jobDetail, simpleTrigger);

      // 啟動調度

      scheduler.start();

      }catch(SchedulerException e){

      e.printStackTrace();

      }

      }

      }

         若使用CornTrigger觸發器:

      [html]

      package com.test;

      import java.util.Date;

      import org.quartz.CronTrigger;

      import org.quartz.JobDetail;

      import org.quartz.Scheduler;

      import org.quartz.SchedulerException;

      import org.quartz.SchedulerFactory;

      import org.quartz.SimpleTrigger;

      import org.quartz.impl.StdSchedulerFactory;

      /**

      * 調用任務的類

      * @author lhy

      *

      */

      public class CronTriggerTest {

      public static void main(String[] args) {

      //通過schedulerFactory獲取一個調度器

      SchedulerFactory schedulerfactory=new StdSchedulerFactory();

      Scheduler scheduler=null;

      try{

      // 通過schedulerFactory獲取一個調度器

      scheduler=schedulerfactory.getScheduler();

      // 創建jobDetail實例,綁定Job實現類

      // 指明job的名稱,所在組的名稱,以及綁定job類

      JobDetail jobDetail=new JobDetail("job1", "jgroup1", MyJob.class);

      // 定義調度觸發規則,每天上午10:15執行

      CronTrigger cornTrigger=new CronTrigger("cronTrigger","triggerGroup");

      // 執行規則表達式

      cornTrigger.setCronExpression("0 15 10 * * ? *");

      // 把作業和觸發器注冊到任務調度中

      scheduler.scheduleJob(jobDetail, cornTrigger);

      // 啟動調度

      scheduler.start();

      }catch(Exception e){

      e.printStackTrace();

      }

      }

      }

      對于2.0.2jar包如下:

      其中的job類不變,主要是調度類如下:

      package com.test;

      import java.util.Date;

      import org.quartz.CronScheduleBuilder;

      import org.quartz.JobBuilder;

      import org.quartz.JobDetail;

      import org.quartz.Scheduler;

      import org.quartz.SchedulerException;

      import org.quartz.SchedulerFactory;

      import org.quartz.SimpleScheduleBuilder;

      import org.quartz.Trigger;

      import org.quartz.TriggerBuilder;

      import org.quartz.impl.StdSchedulerFactory;

      /**

      * 調用任務的類

      * @author lhy

      *

      */

      public class SchedulerTest {

      public static void main(String[] args) {

      //通過schedulerFactory獲取一個調度器

      SchedulerFactory schedulerfactory=new StdSchedulerFactory();

      Scheduler scheduler=null;

      try{

      // 通過schedulerFactory獲取一個調度器

      scheduler=schedulerfactory.getScheduler();

      // 創建jobDetail實例,綁定Job實現類

      // 指明job的名稱,所在組的名稱,以及綁定job類

      JobDetail job=JobBuilder.newJob(MyJob.class).withIdentity("job1", "jgroup1").build();

      // 定義調度觸發規則

      // 使用simpleTrigger規則

      // Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup")

      // .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).withRepeatCount(8))

      // .startNow().build();

      // 使用cornTrigger規則 每天10點42分

      Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup")

      .withSchedule(CronScheduleBuilder.cronSchedule("0 42 10 * * ? *"))

      .startNow().build();

      // 把作業和觸發器注冊到任務調度中

      scheduler.scheduleJob(job, trigger);

      // 啟動調度

      scheduler.start();

      }catch(Exception e){

      e.printStackTrace();

      }

      }

      }

      上述demo下載:1.8版本demo下載

      2.0版本demo下載

      對于CornExpress講解如下:

      字段 允許值 允許的特殊字符

      秒 0-59 , - * /

      分 0-59 , - * /

      小時 0-23 , - * /

      日期 1-31 , - * ? / L W C

      月份 1-12 或者 JAN-DEC , - * /

      星期 1-7 或者 SUN-SAT , - * ? / L C #

      年(可選) 留空, 1970-2099 , - * /

      表達式 意義

      "0 0 12 * * ?" 每天中午12點觸發

      "0 15 10 ? * *" 每天上午10:15觸發

      "0 15 10 * * ?" 每天上午10:15觸發

      "0 15 10 * * ? *" 每天上午10:15觸發

      "0 15 10 * * ? 2005" 2005年的每天上午10:15觸發

      "0 * 14 * * ?" 在每天下午2點到下午2:59期間的每1分鐘觸發

      "0 0/5 14 * * ?" 在每天下午2點到下午2:55期間的每5分鐘觸發

      "0 0/5 14,18 * * ?" 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發

      "0 0-5 14 * * ?" 在每天下午2點到下午2:05期間的每1分鐘觸發

      "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觸發

      特殊字符 意義

      * 表示所有值;

      ? 表示未說明的值,即不關心它為何值;

      - 表示一個指定的范圍;

      , 表示附加一個可能值;

      / 符號前表示開始時間,符號后表示每次遞增的值;

      L("last") ("last") "L" 用在day-of-month字段意思是 "這個月最后一天";用在 day-of-week字段, 它簡單意思是 "7" or "SAT"。 如果在day-of-week字段里和數字聯合使用,它的意思就是 "這個月的最后一個星期幾" – 例如: "6L" means "這個月的最后一個星期五". 當我們用“L”時,不指明一個列表值或者范圍是很重要的,不然的話,我們會得到一些意想不到的結果。

      W("weekday") 只能用在day-of-month字段。用來描敘最接近指定天的工作日(周一到周五)。例如:在day-of-month字段用“15W”指“最接近這個月第15天的工作日”,即如果這個月第15天是周六,那么觸發器將會在這個月第14天即周五觸發;如果這個月第15天是周日,那么觸發器將會在這個月第 16天即周一觸發;如果這個月第15天是周二,那么就在tbw觸發器這天觸發。注意一點:這個用法只會在當前月計算值,不會越過當前月。“W”字符僅能在day-of-month指明一天,不能是一個范圍或列表。也可以用“LW”來指定這個月的最后一個工作日。

      # 只能用在day-of-week字段。用來指定這個月的第幾個周幾。例:在day-of-week字段用"6#3"指這個月第3個周五(6指周五,3指第3個)。如果指定的日期不存在,觸發器就不會觸發。

      C 指和calendar聯系后計算過的值。例:在day-of-month 字段用“5C”指在這個月第5天或之后包括calendar的第一天;在day-of-week字段用“1C”指在這周日或之后包括calendar的第一天

    posted on 2013-12-31 14:13 午后星期午 閱讀(170) 評論(0)  編輯  收藏 所屬分類: JavaEE

    主站蜘蛛池模板: 午夜免费不卡毛片完整版| 在线观看的免费网站无遮挡| 日韩视频在线免费| 亚洲成AV人片久久| 免费视频爱爱太爽了| 亚洲自偷精品视频自拍| 中文字幕亚洲免费无线观看日本 | 亚洲国产成人精品女人久久久 | 亚洲成人国产精品| 国产精品亚洲а∨无码播放不卡| 韩国免费三片在线视频| 男男gay做爽爽免费视频| 亚洲日韩在线中文字幕第一页| 国产精品免费在线播放| 久久青草亚洲AV无码麻豆| 91成人在线免费视频| 亚洲无吗在线视频| 四虎影视免费永久在线观看 | 91在线亚洲精品专区| 任你躁在线精品免费| 亚洲天堂一区二区三区| 国产高清免费的视频| 免费夜色污私人影院网站| 国产亚洲精品无码拍拍拍色欲 | 亚洲日韩精品国产一区二区三区| 热99re久久精品精品免费| 无遮挡a级毛片免费看| 亚洲人成影院在线无码按摩店| 一区二区三区四区免费视频| 2017亚洲男人天堂一| 亚洲?V无码乱码国产精品| 美女无遮挡拍拍拍免费视频| 久久亚洲美女精品国产精品| 97无码免费人妻超级碰碰碰碰 | 国产日本一线在线观看免费| 久久久久久亚洲av无码蜜芽| 亚洲色成人WWW永久网站| 嫖丰满老熟妇AAAA片免费看| 美女被艹免费视频| 久久亚洲精品成人无码网站| 免费人成视频x8x8入口|