Quartz是一個功能強大的java計划任務系統,它通過簡單的配置和代碼完成各種計划人數,定時單機應用到分布式的計算機間遠程任務調度,都可以做到。 quartz是一個按照設定的時間規則來調度作業的調度器,比如可以設定每30s啟動一個Job,但如果Job在30s內還未完成,那么quartz默認情況下還是按照設定的周期啟動新的Job線程 今天剛看了一點資料,做一下筆記。 地址:http://www.opensymphony.com/quartz/ 例子:
- import java.util.ArrayList;
- import java.util.Date;
- import org.quartz.JobDetail;
- import org.quartz.Scheduler;
- import org.quartz.SchedulerException;
- import org.quartz.SchedulerFactory;
- import org.quartz.Trigger;
- import org.quartz.TriggerUtils;
- import org.quartz.impl.StdSchedulerFactory;
- publicclass TimerTest {
- publicstaticvoid main(String... strings) {
- SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
- Scheduler sched;
- try {
- // sched = schedFact.getScheduler();
- sched = StdSchedulerFactory.getDefaultScheduler();
- JobDetail jobDetail = new JobDetail("myJob", // job name
- sched.DEFAULT_GROUP, // job group (you can also specify 'null' to
- // use the default group)
- TestJob.class); // the java class to execute
- jobDetail.getJobDataMap().put("jobSays", "Hello World!");
- jobDetail.getJobDataMap().put("myFloatValue", 3.141f);
- jobDetail.getJobDataMap().put("myStateData", new ArrayList());
- Trigger trigger = TriggerUtils.makeDailyTrigger(0, 1);
- trigger.setStartTime(new Date());
- trigger.setName("myTrigger");
- //Add the given JobDetail to the Scheduler,
- //and associate the given Trigger with it.
- sched.scheduleJob(jobDetail, trigger); sched.start();
- // sched.shutdown();
- } catch (SchedulerException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
import java.util.ArrayList; import java.util.Date; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.Trigger; import org.quartz.TriggerUtils; import org.quartz.impl.StdSchedulerFactory; public class TimerTest { public static void main(String... strings) { SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory(); Scheduler sched; try { // sched = schedFact.getScheduler(); sched = StdSchedulerFactory.getDefaultScheduler(); JobDetail jobDetail = new JobDetail("myJob", // job name sched.DEFAULT_GROUP, // job group (you can also specify 'null' to // use the default group) TestJob.class); // the java class to execute jobDetail.getJobDataMap().put("jobSays", "Hello World!"); jobDetail.getJobDataMap().put("myFloatValue", 3.141f); jobDetail.getJobDataMap().put("myStateData", new ArrayList()); Trigger trigger = TriggerUtils.makeDailyTrigger(0, 1); trigger.setStartTime(new Date()); trigger.setName("myTrigger"); //Add the given JobDetail to the Scheduler, //and associate the given Trigger with it. sched.scheduleJob(jobDetail, trigger); sched.start(); // sched.shutdown(); } catch (SchedulerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
- import java.util.ArrayList;
- import java.util.Date;
- import org.quartz.Job;
- import org.quartz.JobDataMap;
- import org.quartz.JobExecutionContext;
- import org.quartz.JobExecutionException;
- publicclass TestJob implements Job {
- publicvoid execute(JobExecutionContext context) throws JobExecutionException {
- // TODO Auto-generated method stub
- System.out.println("........................................");
- String instName = context.getJobDetail().getName();
- String instGroup = context.getJobDetail().getGroup();
- JobDataMap dataMap = context.getJobDetail().getJobDataMap();
- String jobSays = dataMap.getString("jobSays");
- float myFloatValue = dataMap.getFloat("myFloatValue");
- ArrayList state = (ArrayList) dataMap.get("myStateData");
- state.add(new Date());
- System.out.println("Instance " + instName + " of DumbJob says: " + jobSays);
- }
- }
import java.util.ArrayList; import java.util.Date; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class TestJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { // TODO Auto-generated method stub System.out.println("........................................"); String instName = context.getJobDetail().getName(); String instGroup = context.getJobDetail().getGroup(); JobDataMap dataMap = context.getJobDetail().getJobDataMap(); String jobSays = dataMap.getString("jobSays"); float myFloatValue = dataMap.getFloat("myFloatValue"); ArrayList state = (ArrayList) dataMap.get("myStateData"); state.add(new Date()); System.out.println("Instance " + instName + " of DumbJob says: " + jobSays); } }
運行結果如同http://www.opensymphony.com/quartz/wikidocs/QuickStart.html所說的,顯示了一堆紅色的信息,說明程序讀取了默認的Quartz配置,同時已經啟動了。 問題1:TestJob 中定義的一些輸出信息怎么什么都沒有呢,定義了1分鍾,但是沒有輸出? 仔細看了例子代碼,發現居然范了一個低級錯誤,使用了makeDailyTrigger,該方法是定時,每天幾點幾分進行計划任務,修改為
- Trigger trigger = TriggerUtils.makeSecondlyTrigger(3);
Trigger trigger = TriggerUtils.makeSecondlyTrigger(3);
之后沒三秒鍾就打印:
- ........................................
- ance myJob of DumbJob says: Hello World!
........................................ Instance myJob of DumbJob says: Hello World!
TriggerUtils內還有很多其他有用的方法,看quartz API
再增加一個JOB,只需要增加一個job類,jobDetail,Trigger兩對象,調用scheduleJob方法就可以加入調度隊列了。 這只是一個簡單的例子,quartz還有很復雜的功能,繼續學習。
引用
評論