學習定時任務(Quartz)

1.簡介:

Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,它可以與J2EE與J2SE應用程序相結合也可以單獨使用。Quartz可以用來創建簡單或爲運行十個,百個,甚至是好幾萬個Jobs這樣複雜的程序。Jobs可以做成標準的Java組件或 EJBs。Quartz的最新版本爲Quartz 2.2.3。

2.使用場景:

1).

網頁遊戲中掛機自動修煉如8個小時,人物相關數值進行成長,當使用某道具後,時間減少到4個小時,人物對應獲得成長值.這其中就涉及到了Scheduler的操作,定時對人物進行更新屬性操作,更改定時任務執行時間.

2).
企業中如每天凌晨2點觸發數據同步、發送Email等操作

3.相關資料

官網:http://www.quartz-scheduler.org/

下載jar:http://www.quartz-scheduler.org/downloads

maven pom:

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</dependency>

4.架構的核心分析

1).SchedulerFactory    -- 調度程序工廠

  1. StdSchedulerFactory   -- Quartz默認的SchedulerFactory
  2. DirectSchedulerFactory  --   DirectSchedulerFactory是對SchedulerFactory的直接實現,通過它可以直接構建Scheduler、threadpool 
    1. ThreadExecutor / DefaultThreadExecutor   -- 內部線程操作對象

2).JobExecutionContext -- JOB上下文,保存着Trigger、 JobDeaitl 等信息,JOB的execute方法傳遞的參數就是對象的實例

  1. JobExecutionContextImpl
3).Scheduler    -- 調度器
  1. StdScheduler    -- Quartz默認的Scheduler
  2. RemoteScheduler  -- 帶有RMI功能的Scheduler
4).JOB --任務對象
  1. JobDetail  -- 他是實現輪詢的一個的回調類,可將參數封裝成JobDataMap對象,Quartz將任務的作業狀態保存在JobDetail中.
  2. JobDataMap --  JobDataMap用來報錯由JobDetail傳遞過來的任務實例對象
5).Tigger
  1. SimpleTrigger <普通的Trigger> --  SimpleScheduleBuilder
  2. CronTrigger  <帶Cron Like 表達式的Trigger> -- CronScheduleBuilder
  3. CalendarIntervalTrigger <帶日期觸發的Trigger> -- CalendarIntervalScheduleBuilder
  4. DailyTimeIntervalTrigger <按天觸發的Trigger> -- DailyTimeIntervalScheduleBuilder
6).ThreadPool  --  爲Quartz運行任務時提供了一些線程
  1. SimpleThreadPool  --一個Quartz默認實現的簡單線程池,它足夠健壯,能夠應對大部分常用場景
5.實例代碼

    // 1、工廠模式 構建Scheduler的Factory,其中STD爲Quartz默認的Factory
    //    開發者亦可自行實現自己的Factory;Job、Trigger等組件
    SchedulerFactory sf = new StdSchedulerFactory();
   
    // 2、通過SchedulerFactory構建Scheduler對象
    Scheduler sched = sf.getScheduler();

    // 3、org.quartz.DateBuilder.evenMinuteDate  -- 通過DateBuilder構建Date
    Date runTime = evenMinuteDate( new Date());

    // 4、org.quartz.JobBuilder.newJob <下一分鐘> --通過JobBuilder構建Job
    JobDetail job = newJob(HelloJob.class).withIdentity("job1","group1").build();

    // 5、通過TriggerBuilder進行構建Trigger
    Trigger trigger = newTrigger().withIdentity("trigger1","group1")
                            .startAt(runTime).build();

    // 6、工廠模式,組裝各個組件<JOB,Trigger>
    sched.scheduleJob (job, trigger);

    // 7、start
    sched.start();

    try {
      Thread.sleep(65L * 1000L);
    } catch (Exception e) {
    }

    // 8、通過Scheduler銷燬內置的Trigger和Job
    sched.shutdown(true);

6.總結

   1、創建調度工廠();    //工廠模式
   2、根據工廠取得調度器實例();  //工廠模式
   3、Builder模式構建子組件<Job,Trigger>  // builder模式, 如JobBuilder、TriggerBuilder、DateBuilder
   4、通過調度器組裝子組件   調度器.組裝<子組件1,子組件2...>  //工廠模式
   5、調度器.start(); //工廠模式


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章