星期四, 7月 06, 2006

OPENSYMPHONY Quartz(java cron job)備忘記

在java裡,自己寫一個Scheduler實在是煩人的事,
有些人選擇依靠OS的Scheduler或Crontab job.
在java的世界裡,可以使用Quartz來實作定時執行工作,
就像在unix like系統裡設定crontab job一樣簡單.


首先下載 quartz-1.5.2.zip
http://www.opensymphony.com/quartz/download.action
解壓後把 quartz-all-1.5.2.jar 加入環境變數 CLASSPATH 裡.


由於Quartz logging使用了Apache Commons logging.
故需要同時下載 commons-logging-1.1.zip
http://jakarta.apache.org/site/downloads/downloads_commons-logging.cgi
解壓後把 commons-logging-1.1.jar 加入環境變數中及加到 jdk_home/jre/lib/ext 裡.
這問題也煩了我一陣子. 如果沒加到 jdk_home/jre/lib/ext 裡, 會出現下面這個exception.
java.lang.NoClassDefFoundError: org/apache/commons/logging/Log


在quartz-1.5.2.zip裡亦包含以下的examples:
example1 - Your first Quartz Program
example2 - Simple Job Triggers
example3 - Cron Triggers
example4 - Job State and Job Parameters
example5 - Job Misfires
example6 - Handling Job Exceptions
example7 - Interrupting Jobs
example8 - How to use Quartz Calendars
example9 - Using Job Listeners
example10 - Using Quartz Plug-Ins
example11 - Loading Up Quartz with Many Jobs
example12 - Remoting with Quartz using RMI
example13 - Clustering Quartz and JDBC Job Stores


跟隨這些examples作練習會對quartz更進一步的了解.


我要實作的案例很簡單,在一定的間隔裡執行某項工作.


SayHelloJob.java
public class SayHelloJob implements Job { // 我們的job需要implement Job的execute.
public void execute(JobExecutionContext arg0) throws JobExecutionException {
Log log = LogFactory.getLog(SayHelloJob.class);
log.info(new Date()+"#start myjob!"); // 打印開始時間

System.out.println("Joeyta says hello to EveryBody.");
// 這裡我們的job是print message

log.info(new Date()+"#end myjob!"); // 打印結束時間
}
}


MyCronJob.java
public class MyCronJob {


public void doMyCronJob() throws SchedulerException, ParseException {
Log log = LogFactory.getLog(MyCronJob.class);
log.info("-----------job initialize----------");
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler(); // 取得scheduler的reference


JobDetail job = new JobDetail("job1", "group1", SayHelloJob.class);
// 由於quartz support多group到多job. 這裡我們只有一個job. 我們自己我隨意把它命名.
// 但相同group裡如果出現相同的job名,會被overrride.
CronTrigger cTrigger = new CronTrigger("trigg1", "group1", "job1",
"group1", "1/10 * * * * ?");
// 這裡指定trigger執行那個group的job.
// "1/10 * * * * ?" 與 在unix like裡的crontab job的設定類似. 這裡表示每天裡的每10秒執行一次
// Seconds Minutes Hours Day-of-Month Month Day-of-Week Year(optional field)
// 可參考 http://www.opensymphony.com/quartz/wikidocs/TutorialLesson6.html
// 及 http://www.opensymphony.com/quartz/api/org/quartz/CronTrigger.html
Date ft = sched.scheduleJob(job, cTrigger);
log.info("job start at:" + ft); // 記錄何時開始執行工作
sched.start();
}


public static void main(String[] args) throws Exception {
MyCronJob cronJob = new MyCronJob();
cronJob.doMyCronJob();
}


}


以下是一些官方的教學:
http://www.opensymphony.com/quartz/wikidocs/Tutorial.html

沒有留言: