Quartz_2_簡單編程式任務調度使用(CronTrigger)


  第二個要介紹的任務調度器中的觸發器是 CronTrigger ,相比較 SimpleTrigger 來說,CronTrigger 相對靈活,對於復雜的業務需求來說,更加的實用。要在使用 CronTrigger 之前,要先介紹下 Cron 表達式。在這里,Cron 表達式的內容使用網上的介紹,理論性的東西,大致都是差不多的。

Cron 表達式的內容如下:

其中,表達式中的特殊符號的意義是:

               “?”字符:表示不確定的值(注意:? 號只能用在日和周域上,但是不能在這兩個域上同時使用。假如你為這兩域的其中一個指定了值,那就必須在另一個字值上放一個 ?,如:0 0 0 * * ?)

               “,”字符:指定數個值

               “-”字符:指定一個值的范圍

               “/”字符:指定一個值的增加幅度。n/m表示從n開始,每次增加m

               “L”字符:用在日表示一個月中的最后一天,用在周表示該月最后一個星期X

               “W”字符:指定離給定日期最近的工作日(周一到周五)

               “#”字符:表示該月第幾個周X。5#2表示該月第2個周四(每周的第一天是從周日開始的,即:周日的值為:1)

簡單的使用 Cron 的示例如下:

在每個周一,二, 三和周四的 10:15 AM 0 15 10 ? * MON-FRI
每月10號的 10:15 AM   0 15 10 10 * ?
每月最后一天的 10:15 AM 0 15 10 L * ?
每月最后一個周五的 10:10 AM  0 10 10 ? * 6L
在 2014, 2015, 2016, 和 2017 年中的每月最后一個周五的 10:10 AM  0 10 10 ? * 6L 2014-2017
每月第三個周五的 10:15 AM 0 15 10 ? * 6#3
每月從第一天算起每五天的 12:00 PM (中午) 0 0 12 1/5 * ?
每一個 11 月 11 號的 11:11 AM 0 11 11 11 11 ?
三月份每個周三的 2:10 PM 和 2:44 PM 0 10,44 14 ? 3 WED

但是,如果我想執行:14:00 開始,到 07:00結束的話,不能用單純的時間間隔了。因為,在跨越了天的情況下,是會出現問題或者沒有執行指定的操作的。那這樣的話,可以分開執行的,

如:14:00-07:00的寫法是:先執行當天的:* * 14-23 * * ?,再執行第二天的:* * 0-6 * * ?,二者觸發的是同一個作業。

  基本的知識介紹完了之后,下面是我自己寫的一個簡單實用 CronTrigger 的例子,還是和之前的例子類似,2.0.0之后的用法,和2.0.0之前的用法,還是有所區別的。

(1)首先是作業(Job)類

 

/**
 * 0.0.0.1
 */
package com.test.common.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * 簡單的 作業類
 * @author 高青
 * 2014-3-24
 */
public class QuartzCronTiggerJob implements Job{

    @Override
    public void execute(JobExecutionContext jobContext) throws JobExecutionException {
       System.out.println("這是一個 cronTrigger 的測試類");
       
       //這里可以執行具體的業務操作.......
    }
}

(2)任務調度器

/**
 * 0.0.0.1
 */
package com.test.common.quartz;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/**
 * cronTrigger 觸發器的測試類
 * @author 高青
 * 2014-3-26
 */
public class QuartzCronTiggerJobTest {

    /**
     * 主線程方法
     * @author 高青 
     * 2014-3-26
     * @param args 字符串參數
     * @return*/
    public static void main(String[] args) {
        
        try {
            //得到默認的調度器
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            
            //定義當前調度器的具體作業對象
            JobDetail jobDetail = JobBuilder.
                                  newJob(QuartzCronTiggerJob.class).
                                  withIdentity("cronTriggerDetail", "cronTriggerDetailGrounp").
                                  build();
            //定義當前具體作業對象的參數
            JobDataMap jobDataMap = jobDetail.getJobDataMap();
            jobDataMap.put("name", "cronTriggerMap");
            jobDataMap.put("group", "cronTriggerGrounp");
            
            //作業的觸發器
            CronTrigger cronTrigger = TriggerBuilder.                      //和之前的 SimpleTrigger 類似,現在的 CronTrigger 也是一個接口,通過 Tribuilder 的 build()方法來實例化
                                        newTrigger().
                                        withIdentity("cronTrigger", "cronTrigger").
                                        withSchedule(CronScheduleBuilder.cronSchedule("0 48 14 * * ?")). //在任務調度器中,使用任務調度器的 CronScheduleBuilder 來生成一個具體的 CronTrigger 對象
                                        build();
            //注冊作業和觸發器
            scheduler.scheduleJob(jobDetail, cronTrigger);
            
            //開始調度任務
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }        
    }
}

上面就是 2.0 版本的 CronTrigger 的簡單使用,可以根據具體的業務,再具體的進行任務的調度操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM