Java EE學習——Quartz的Cron表達式


經歷過低谷后,還是要好好學習,越失落會越來越落后。

 

今天寫一下Cron表達式的用法,雖然是之前自己寫的,也過了挺長一段時間,這次就拿出來作為回顧吧。

 

Cron表達式是Quartz的精髓(個人覺得),比如我們想設定淘寶“秒殺”的那一秒時間,完全可以用下面的方法設置執行時間。

Calendar cal = Calendar.getInstance();
//設置將要發生的時間...
cal.set(Calendar.DATE, xxx);
//.......常規的生成scheduler和job
//Trigger設置為這個日期
Trigger trigger = TriggerBuilder.newTrigger().startAt(cal.getTime()).build();
//接着還是一般的流程

可以百度或者參加我前一篇博客《Java EE學習--Quartz基本用法》了解一下Quartz最簡單的用法。

 

這里說到Cron表達式:比如公司每天上下班打卡,一周周末檢查工作完成情況,網站每月統計用戶數據,等等,這些情況想通過一個Date來設置,非常的麻煩,而且會開大量的實例,影響效率。

我們還是舉一個最簡單的例子,繼承Job類,重寫一個execute方法:

public class MyJob3 implements Job
{
    public void execute(JobExecutionContext ctx) throws JobExecutionException
    {
        System.out.println("It's Time for me to run!!WUHA╰_╯");
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("now time is:"+format.format(new Date()));
    }
}

然后,使用CronTrigger來實現帶Cron表達式的觸發器:

    public static void main(String[] args) throws Exception
    {
        SchedulerFactory factory = new StdSchedulerFactory();
        Scheduler sche = factory.getScheduler();
        
        JobDetail job = JobBuilder.newJob(MyJob3.class).build();
        //cron表達式說明
        /*
         *    六個或七個單元
         * 秒 分 時 月中天 月份 月中星期幾 (年)
         * 秒,分,時,天
         * 字段 允許值 允許的特殊字符
            秒 0-59 , - * /
            分 0-59 , - * /
            小時 0-23 , - * /
            日期 1-31 , - * ? / L W C
            月份 1-12 或者 JAN-DEC , - * /
            星期 1-7 或者 SUN-SAT , - * ? / L C #
            年(可選) 留空, 1970-2099 , - * / 
         
         * 符號說明
            星號:表示任意時刻
            問號:只能在日或周字段上使用,簡單的理解就是日期和星期是有沖突的,指定其中一個的話,另外一個是沒辦法指定的,比如每個月12號和每個星期二,這兩個是"互斥"的,不能用日期和周來指定所有“每個是星期二的12號”這個時間。
            減號:范圍,如 1-5秒
            逗號:列表,如 1,5,10 秒
            斜杠:等步長序列,如3/13秒 表示 3,16,29,42,55,3,16...
            L:僅在日和周上支持,表示允許的最后一個值,注意不要讓范圍和列表與L連用
            W:工作日
            井號:為給定月份指定具體的工作日實例。把“MON#2”放在周內日期字段中,表示把任務安排在當月的第二個星期一。 
         */
        //秒 分 時 月中天 月份 月中星期幾 (年)
        String cron = "0/10 * * 8W 8 ? 2008-2015";
   
        CronTrigger trigger = TriggerBuilder.newTrigger().
                                                    withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
        System.out.println("now is:"+new Date());
        sche.scheduleJob(job,trigger);
        sche.start();
        Thread.sleep(180*1000);
        sche.shutdown();
    }

很簡單的把Cron用法在代碼中的注釋寫了,大家可以在百度上搜索具體的用法,這里我復制別人的沒有意思,可以參見http://xgw1008.blog.163.com/blog/static/567573562009316011544/

月份和日期都是從1開始的,不是從0,一般你常規認為的時間是幾月幾號,在Cron中就應該寫多少。

以我的

0/10 * * 8W 8 ? 2008-2015

作說明:

從2008年到2015年(實際中年份可不寫),8月份距離8號最近的工作日(幾號后面加W,今天,如果是9W,那么還是取最近的工作日,還是今天),倒數第二個是?號表示和已經寫上去的8號互斥,每時每分,從0秒開始每隔10秒觸發(秒數除以10余0),效果如下:

now is:Fri Aug 08 10:07:41 CST 2014
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:07:50
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:08:00
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:08:10
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:08:20
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:08:30
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:08:40
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:08:50
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:09:00
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:09:10
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:09:20
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:09:30
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:09:40
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:09:50
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:10:00
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:10:10
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:10:20
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:10:30
It's Time for me to run!!WUHA╰_╯
now time is:2014-08-08 10:10:40

完全是按照已制定的想法來的,每隔10秒顯示一次,Quartz的功能真的非常強大!


免責聲明!

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



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