JCronTab 定時調用

習慣使用 unix/linux 的開發人員應該對 crontab 都不陌生。Crontab 是一個非常方便的用於 unix/linux 系統的任務調度命令。JCronTab 則是一款完全按照 crontab 語法編寫的 java 任務調度工具。

首先簡單介紹一下 crontab 的語法,與上面介紹的 Quartz 非常相似,但更加簡潔 , 集中了最常用的語法。主要由六個字段組成(括弧中標識了每個字段的取值範圍):

Minutes (0-59)
 Hours   (0-23) 
 Day-of-Month (1-31)
 Month    (1-12/JAN-DEC) 
 Day-of-Week  (0-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” [email protected]

每週一,週二,週三,週六的晚上 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 識別。

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

org.jcrontab.data.file=/Users/meHao/Documents/qinian/WebRoot/WEB-INF/classes/crontab //這個路徑爲絕對路徑
org.jcrontab.data.datasource=org.jcrontab.data.FileSource

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

 */2 * * * * com.ibm.scheduler.JCronTask1 
 * * * * * com.ibm.scheduler.JCronTask2#run Hello World
第一個爲調用了JCronTask1的main方法,第二個是JCRONJask2的run方法

JCronTask1.java

public class JCronTask1 {
private static int count = 0;
public static void main(String[] args) {
System.out.println("Task1Current Time = " + new Date().toLocaleString() + ", Count = "+ count++);
}
}

JCroTask2.java

public class JCronTask2 implements Runnable {
private static int count = 0;
private static String[] args;

public JCronTask2(String[] args) {
System.out.println("Task2: Current Time = " + new Date().toLocaleString() + ", 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");
}
}
}
}

以上,配置就基本結束了,接下來就是調試一下。

Task1Current Time = 2014-10-8 14:49:00, Count = 1
Task1Current Time = 2014-10-8 14:50:00, Count = 2
Task2: Current Time = 2014-10-8 14:50:00, Count = 1
enter into run method:
This is arg 0 Hello
This is arg 1 World

發佈了55 篇原創文章 · 獲贊 17 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章