JCronTab初步認識

本編文章來自: http://www.ibm.com/developerworks/cn/java/j-lo-taskschedule/

Crontab 是一個非常方便的用於 unix/linux 系統的任務調度命令。JCronTab 則是一款完全按照 crontab 語法編寫的 java 任務調度工具。
首先簡單介紹一下 crontab 的語法,與上面介紹的 Quartz 非常相似,但更加簡潔 , 集中了最常用的語法。主要由六個字段組成(括弧中標識了每個字段的取值範圍):

 Minutes (0-59)
 Hours   (0-23) 
 Day-of-Month1-31)
 Month    (1-12/JAN-DEC) 
 Day-of-Week0-6/SUN-SAT)
 Command

與 Quartz 相比,省略了 Seconds 與 Year,多了一個 command 字段,即爲將要被調度的命令。JCronTab 中也包含符號“*”與“/”, 其含義與 Quartz 相同。

每天 12 點到 15 點 , 每隔 1 小時執行一次 Date 命令:

0 12-15/1 * * * Date

每月 2 號凌晨 1 點發一封信給 [email protected]

 0 1 2 * * mail -s “good” zhjingbj@cn.ibm.com

每週一,週二,週三,週六的晚上 20:00 到 23:00,每半小時打印“normal”:

0/30 20-23 * * MON-WED,SAT echo “normal”

JCronTab 借鑑了 crontab 的語法,其區別在於 command 不再是 unix/linux 的命令,而是一個 Java 類。

“com.ibm.scheduler.JCronTask2#run”,則定期執行 run 方法;如果該類不帶參數,則默認執行 main 方法。此外,還可以傳參數給 main 方法或者構造函數,例如“com.ibm.scheduler.JCronTask2#run Hello World“表示傳兩個參數 Hello 和 World 給構造函數。

JCronTab 與 Quartz 相比,其優點在於,第一,支持多種任務調度的持久化方法,包括普通文件、數據庫以及 XML 文件進行持久化;

二,JCronTab 能夠非常方便地與 Web 應用服務器相結合,任務調度可以隨 Web 應用服務器的啓動自動啓動;

第三,JCronTab 還內置了發郵件功能,可以將任務執行結果方便地發送給需要被通知的人。

JCronTab 與 Web 應用服務器的結合非常簡單,只需要在 Web 應用程序的 web.xml 中添加如下行:

<servlet> 
   <servlet-name>LoadOnStartupServlet</servlet-name> 
   <servlet-class>org.jcrontab.web.loadCrontabServlet</servlet-class> 
   <init-param> 
 <param-name>PROPERTIES_FILE</param-name> 
 <param-value>D:/Scheduler/src/jcrontab.properties</param-value> 
   </init-param> 
   <load-on-startup>1</load-on-startup> 
 </servlet> 
 <!-- Mapping of the StartUp Servlet --> 
 <servlet-mapping> 
   <servlet-name>LoadOnStartupServlet</servlet-name> 
 <url-pattern>/Startup</url-pattern> 
 </servlet-mapping>

需要注意兩點:第一,必須指定 servlet-class 爲 org.jcrontab.web.loadCrontabServlet,因爲它是整個任務調度的入口;第二,必須指定一個參數爲 PROPERTIES_FILE,才能被 loadCrontabServlet 識別。

接下來,需要撰寫 D:/Scheduler/src/jcrontab.properties 的內容,其內容根據需求的不同而改變。

當採用普通文件持久化時,jcrontab.properties 的內容主要包括:

org.jcrontab.data.file = D:/Scheduler/src/crontab 
 org.jcrontab.data.datasource = org.jcrontab.data.FileSource

其中數據來源 org.jcrontab.data.datasource 被描述爲普通文件,即 org.jcrontab.data.FileSource。具體的文件即 org.jcrontab.data.file 指明爲 D:/Scheduler/src/crontab。

Crontab 描述了任務的調度安排:

 */2 * * * * com.ibm.scheduler.JCronTask1 
 * * * * * com.ibm.scheduler.JCronTask2#run Hello World

其中包含了兩條任務的調度,分別是每兩分鐘執行一次 JCronTask1 的 main 方法,每一分鐘執行一次 JCronTask2 的 run 方法。

 package com.ibm.scheduler;

import java.util.Date;

public class JCronTask1 {

    private static int count = 0;

    public static void main(String[] args) {
        System.out.println("--------------Task1-----------------");
        System.out.println("Current Time = " + new Date() + ", Count = "
                + count++);
    }
}

package com.ibm.scheduler;

import java.util.Date;

public class JCronTask2 implements Runnable {

    private static int count = 0;

    private static String[] args;

    public JCronTask2(String[] args) {
        System.out.println("--------------Task2-----------------");
        System.out.println("Current Time = " + new Date() + ", Count = "
                + count++);
        JCronTask2.args = args;
    }

    @Override
    public void run() {
        System.out.println("enter into run method");
        if (args != null && args.length > 0) {
            for (int i = 0; i < args.length; i++) {
         System.out.print("This is arg " + i + " " + args[i] + "\n");
            }
        }
    }
}

到此爲止,基於普通文件持久化的 JCronTab 的實例就全部配置好了。啓動 Web 應用服務器,便可以看到任務調度的輸出結果:

--------------Task2----------------- 
 Current Time = Tue Feb 15 09:22:00 CST 2011, Count = 0 
 enter into run method 
 This is arg 0 Hello 
 This is arg 1 World 
 --------------Task1----------------- 
 Current Time = Tue Feb 15 09:22:00 CST 2011, Count = 0 
 --------------Task2----------------- 
 Current Time = Tue Feb 15 09:23:00 CST 2011, Count = 1 
 enter into run method 
 This is arg 0 Hello 
 This is arg 1 World 
 --------------Task2----------------- 
 Current Time = Tue Feb 15 09:24:00 CST 2011, Count = 2 
 enter into run method 
 This is arg 0 Hello 
 This is arg 1 World 
 --------------Task1----------------- 
 Current Time = Tue Feb 15 09:24:00 CST 2011, Count = 1

通過修改 jcrontab.properties 中 datasource,可以選擇採用數據庫或 xml 文件持久化。
此外,JCronTab 還內置了發郵件功能,可以將任務執行結果方便地發送給需要被通知的人。其配置非常簡單,只需要在 jcontab.properties 中添加幾行配置即可:

 org.jcrontab.sendMail.to= Ther email you want to send to 
 org.jcrontab.sendMail.from=The email you want to send from 
 org.jcrontab.sendMail.smtp.host=smtp server 
 org.jcrontab.sendMail.smtp.user=smtp username 
 org.jcrontab.sendMail.smtp.password=smtp password
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章