根據Jcrontab存儲的不同的數據源,我們可以分成以下幾個:
在程序中也可以添加要執行的數據源,比如執行本地的應用程序等。下面分別介紹一下。在這之前,先介紹一下有關Jcrontab用到的配置文件:
通過文件記錄數據源
下面通過例子,我們來講解一個具體的Jcrontab程序,看它是如何定時處理程序的。
運行程序的JCrontabApp類: JCrontabApp類 import org.jcrontab.Crontab;
import org.jcrontab.NativeExec;
import org.jcrontab.SendMail;
import org.jcrontab.data.CrontabParser;
import org.jcrontab.data.CrontabEntryBean;
import org.jcrontab.data.CrontabEntryDAO;
import Java.io.File;
public class JCrontabApp {
private static Crontab cron = null;
private String JcrontabFile = null;
public JCrontabApp() {
}
public String getJcrontabFile() {
return JcrontabFile;
}
public void setJcrontabFile(String jcrontabFile) {
JcrontabFile = jcrontabFile;
}
/**
* 初始化Jcrontab,通過指定的jcrontab.propertIEs來執行具體的操作
* 啟動Jcrontab
*/
protected void init() {
cron = Crontab.getInstance();
try {
ShutdownHook();
cron.setDaemon(false);
if (null == JcrontabFile)
cron.init();
cron.init(JcrontabFile);
System.out.println("Start Jcrontab...");
} catch (Java.lang.Exception e) {
e.printStackTrace();
}
}
/**
* 關閉Jcrontab的執行
* @throws Exception
*/
protected void ShutdownHook() throws Exception {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.out.println("Shutting down...");
cron.uninit(200);
System.out.println("Stoped Jcrontab!");
}
});
}
/**
* 判斷是否是Holiday
* @return
* @throws Exception
*/
public boolean isHoliday()throws Exception{
return cron.isHoliday();
}
/**
* 根據不同的參數執行不同的定時程序,可選參數可從main方法中查看
* @param args
* @throws Exception
*/
public void exectue(String[] args) throws Exception {
if (args.length < 2) {
return;
}
this.setJcrontabFile(args[0]);
init();
if ("database".equals(args[1]))
executeDatabase();
else if ("appliction".equals(args[1])) {
String[] parameters = new String[args.length-2];
System.arraycopy(args,2,parameters,0,args.length-2);
cron.newTask("org.jcrontab.NativeExec","main",parameters);
} else if ("Javamail".equals(args[1]))
executeJavaMail(args[2]);
}
/**
* 執行數據庫的操作
* @throws Exception
*/
protected void executeDatabase() throws Exception {
CrontabParser cp = new CrontabParser();
CrontabEntryBean[] ceb = new CrontabEntryBean[2];
ceb[0] = cp.marshall("* * * * * com.aweb.test.NumTest 123");
ceb[0].setYears("*");
ceb[0].setSeconds("0");
ceb[0].setBusinessDays(true);
ceb[0].setId(0);
ceb[1] = cp.marshall("* * * * * com.aweb.test.LetterTest 234");
ceb[1].setYears("*");
ceb[1].setSeconds("0");
ceb[1].setBusinessDays(true);
ceb[1].setId(1);
CrontabEntryDAO.getInstance().store(ceb);
}
/**
* 執行本地的應用程序的操作
* @param parameters
*/
protected void executeAppliction(String[] parameters) {
NativeExec.main(parameters);
}
/**
* 將執行的文件發送為email
* @param sendFilename
* @throws Exception
*/
protected void executeJavaMail(String sendFilename) throws Exception {
File sendFile = new File(sendFilename);
SendMail sm = new SendMail();
sm.send(sendFile);
}
/**
* 主要通過main方法來實現Jcrontab的實現
* @param args
* @throws Exception
*/
public static void main(String args[]) throws Exception {
if (args.length < 2) {
System.out.println("Usage:The values of args:
System.out.println("********************************************************");
System.out.println("Optional Parameters of type:");
System.out.println("-filedata:doing file Operating.");
System.out.println("-database:doing database Operating.");
System.out.println("-appliction
System.out.println("-Javamail
System.out.println("********************************************************");
System.exit(1);
}
JCrontabApp jp = new JCrontabApp();
jp.exectue(args);
System.out.println(jp.isHoliday());
}
}
帶測試運行的NumTest類和LetterTest類:
NumTest類 public class NumTest {
LetterTest類
public static void main(String args[]){
for(int i=0;i<10;i++){
System.out.println("Time:"+System.currentTimeMillis()+" i= "+i);
}
}
} public class LetterTest {
public static void main(String args[]) {
System.out.println("Time: " + System.currentTimeMillis() + " Letter: " + "hello World!");
}
}
配置文件Jcrontab.propertIEs:
Jcrontab.propertIEs文件 ##
#Mon May 24 19:12:24 CEST 2004
org.jcrontab.version=2.0.RC1
org.jcrontab.log.Logger=org.jcrontab.log.Log4JLogger
org.jcrontab.log.log4J.Properties=log4j.propertIEs
org.jcrontab.data.file = crontab
org.jcrontab.data.datasource = org.jcrontab.data.FileSource
org.jcrontab.Crontab.refreshFrequency = 3
處理定時程序的crontab文件:
crontab文件 * * * * * com.aweb.test.NumTest
* * * * * com.aweb.test.LetterTest
然後,我們在命令行輸入jcrontab.propertIEs文件的位置,和要處理的類型,這裡,我們選filedata,接著運行該類,我們就可以看到它的執行結果:
[2004-10-19 16:10:20,296 LV:DEBUG CL:jcrontab] org.jcrontab.log.log4J.Properties : log4j.propertIEs
[2004-10-19 16:10:20,296 LV:DEBUG CL:jcrontab] org.jcrontab.version : 2.0.RC1
[2004-10-19 16:10:20,296 LV:DEBUG CL:jcrontab] org.jcrontab.Crontab.refreshFrequency : 3
[2004-10-19 16:10:20,296 LV:DEBUG CL:jcrontab] org.jcrontab.data.file : crontab.propertIEs
[2004-10-19 16:10:20,296 LV:DEBUG CL:jcrontab] org.jcrontab.data.datasource : org.jcrontab.data.FileSource
[2004-10-19 16:10:20,296 LV:DEBUG CL:jcrontab] org.jcrontab.log.Logger : org.jcrontab.log.Log4JLogger
Start Jcrontab...
[2004-10-19 16:10:20,500 LV:DEBUG CL:jcrontab] Interval to sleep : 39984
[2004-10-19 16:11:00,484 LV: INFO CL:jcrontab] com.aweb.test.NumTest#
[2004-10-19 16:11:00,484 LV: INFO CL:jcrontab] com.aweb.test.LetterTest#
[2004-10-19 16:11:00,484 LV:DEBUG CL:jcrontab] Interval to sleep : 60000
Time:1098173460484 i= 0
Time:1098173460484 i= 1
Time:1098173460484 i= 2
Time:1098173460484 i= 3
Time:1098173460484 i= 4
Time:1098173460484 i= 5
Time:1098173460484 i= 6
Time:1098173460500 i= 7
Time:1098173460500 i= 8
Time:1098173460500 i= 9
Time: 1098173460515 Letter: hello World!
這樣每隔一分鐘,就會運行一次NumTest類和LetterTest類
增加下面的屬性:
org.jcrontab.data.GenericSQLSource.driver = org.gjt.mm.MySQL.Driver
org.jcrontab.data.GenericSQLSource.url = jdbc:MySQL://127.0.0.1/netbook
org.jcrontab.data.GenericSQLSource.username = root
org.jcrontab.data.GenericSQLSource.passWord =
org.jcrontab.data.datasource = org.jcrontab.data.GenericSQLSource
這樣,我們再在命令行下輸入jcrontab.propertIEs文件的位置,和要處理的類型,這裡,我們選database,就可以執行我們寫好的兩個類了。運行時,它是先將這兩個待處理的類的數據源,按照規定好的數據庫中的字段,一一存入數據庫中,然後再從數據庫中讀取events表中的每一行(這每一行就是待處理的數據源),它就根據這些行定時處理。執行的結果同上。去掉原來的crontab文件中的信息,加上下面的屬性
org.jcrontab.data.file = crontab.XML
org.XML.sax.driver=org.apache.xerces.parsers.SAXParser
org.jcrontab.data.datasource=org.jcrontab.data.XMLSource
同樣在命令行下輸入jcrontab.propertIEs文件的位置,和要處理的類型,這裡和文件的一樣選filedata,來運行該類,執行結果同上。<?XML version="1.0" encoding="GB2312"?>
<CRONTAB>
<SECONDS>0</SECONDS>
<MINUTES>*</MINUTES>
<HOURS>*</HOURS>
<DAYSOFMONTH>*</DAYSOFMONTH>
<MONTHS>*</MONTHS>
<DAYSOFWEEK>*</DAYSOFWEEK>
<YEARS>*</YEARS>
<BUSSINESDAYS>true</BUSSINESDAYS>
<STARTDATE>null</STARTDATE>
<ENDDATE>null</ENDDATE>
<CLASS>com.aweb.test.NumTest</CLASS>
<method>main</method>
<DESCRIPTION>null</DESCRIPTION>
</CRONTABENTRY>
<CRONTABENTRY id=1>
<SECONDS>0</SECONDS>
<MINUTES>*</MINUTES>
<HOURS>*</HOURS>
<DAYSOFMONTH>*</DAYSOFMONTH>
<MONTHS>*</MONTHS>
<DAYSOFWEEK>*</DAYSOFWEEK>
<YEARS>*</YEARS>
<BUSSINESDAYS>true</BUSSINESDAYS>
<STARTDATE>null</STARTDATE>
<ENDDATE>null</ENDDATE>
<CLASS>com.aweb.test.LetterTest</CLASS>
<method>main</method>
<DESCRIPTION>null</DESCRIPTION>
</CRONTABENTRY>
<CRONTABENTRY id=2>
<SECONDS>0</SECONDS>
<MINUTES>*</MINUTES>
<HOURS>*</HOURS>
<DAYSOFMONTH>*</DAYSOFMONTH>
<MONTHS>*</MONTHS>
<DAYSOFWEEK>*</DAYSOFWEEK>
<YEARS>*</YEARS>
<BUSSINESDAYS>true</BUSSINESDAYS>
<STARTDATE>null</STARTDATE>
<ENDDATE>null</ENDDATE>
<CLASS>org.jcrontab.NativeExec</CLASS>
<method>main</method>
<PARAMETERS>net send 192.168.0.109 "你好!每一分鐘出現一次!呵呵"</PARAMETERS>
<DESCRIPTION>null</DESCRIPTION>
</CRONTABENTRY>
</CRONTAB>
這樣執行的結果就是每隔一分鐘就會執行一次net send命令(是不是裝了個定時炸彈呀!呵呵,不過是在服務器端才運行的喲!)。增加下面的屬性
<A href="mailto:[email protected]">[email protected]</A>
<A href="mailto:[email protected]">[email protected]</A>
org.jcrontab.SendMail.smtp.host=smtp.sohu.com
org.jcrontab.SendMail.smtp.username= yourname
org.jcrontab.SendMail.smtp.password=passWord
這樣它就會將執行的數據源發送到你的郵箱中。不過,目前這個我沒有測試成功,我認為主要是由於郵件服務器的原因吧,它總是出現JavaMail的運行異常。程序方面應該不會有問題,這需要我在以後的學習中繼續來完成,也希望大家幫我實現這個功能!總結:Jcrontab提供的定時處理程序的功能不單單是這些,還可以定時處理EJB等高級的組件,在應用服務器中也可以采用Servlet的方式來定時處理(個人感覺:它提供的用Servlet來定時處理程序的功能不太好!大家去慢慢體會吧!)。還有一些其它方面的功能,還需要繼續的學習和探索!