<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 午后星期午 閱讀(171) 評論(0)  編輯  收藏 所屬分類: JavaEE

    主站蜘蛛池模板: 内射无码专区久久亚洲| 在线精品免费视频无码的| 亚洲中文字幕无码不卡电影| 亚洲欧洲国产综合AV无码久久 | 九九全国免费视频| 国产美女无遮挡免费视频 | 天堂在线免费观看中文版| 亚洲国产片在线观看| 在线视频免费观看爽爽爽| 亚洲va成无码人在线观看| 无码国产精品一区二区免费虚拟VR| 亚洲美女中文字幕| 国内精自视频品线六区免费 | 在线观看国产一区亚洲bd| 国产免费爽爽视频免费可以看| 亚洲av午夜国产精品无码中文字 | 久久天天躁狠狠躁夜夜免费观看| 亚洲成av人片不卡无码| 欧美在线看片A免费观看| 亚洲AV无码一区二区三区在线| 毛片a级毛片免费观看免下载 | 亚洲AV福利天堂一区二区三| 99re免费99re在线视频手机版| 亚洲六月丁香六月婷婷蜜芽| 免费a级毛片无码a∨蜜芽试看| 亚洲欧美成人综合久久久 | 亚洲国产美女精品久久久久∴| 日韩免费无码视频一区二区三区 | a毛片免费全部在线播放**| 亚洲经典在线观看| 在线观看成人免费| 乱人伦中文视频在线观看免费| 亚洲av中文无码乱人伦在线咪咕| 无码中文字幕av免费放| 日日狠狠久久偷偷色综合免费 | 亚洲AV无码日韩AV无码导航| 永久在线免费观看| 国产综合激情在线亚洲第一页| 久久久久久久综合日本亚洲| 青娱乐免费视频在线观看| 男女超爽视频免费播放|