習慣使用 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.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