Quartz是一個徹底由java編寫的任務調度框架。
那麼什麼是任務調度呢?不少時候你可能會收到某個需求,要求程序 「 隔某個特定的時間段 在某個特定的時間 作某個特定的事情 」,好比:java
這些都是任務調度。而Quartz就是能夠方便你建立各類任務定時執行的一個框架,並且觸發這些任務的時間點能夠設計的很是複雜,幾乎都能完美匹配你的要求。web
使用Quartz開發,首先,你要寫一個實現org.quartz.Job的類,重寫org.quartz.Job接口惟一的方法execute(),在這個方法裏面寫你要定時執行的代碼。服務器
public class TestJob implements Job{ public void execute(JobExecutionContext arg0) throws JobExecutionException { Date date=new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.print("now:"+sf.format(date)); } }
而後,建立一個執行任務的類,建立scheduler,這能夠理解爲一個調度程序-任務執行計劃表,在這個表裏面對各個job任務進行時間分配。框架
SchedulerFactory sfact = new StdSchedulerFactory(); Scheduler schedule = sfact.getScheduler();
而後,建立JobDetail的實例,指定執行哪一個job。分佈式
JobDetail jobDetail1 = JobBuilder.newJob((Class<? extends Job>) TestJob.class) //定義Job類爲TestJob類 .withIdentity("myjob1", "group1") //定義name、group .build();
而後,建立一個CronTrigger實例,指定執行時間。ui
CronTrigger trigger1 =(CronTrigger) TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("0 0 10 ? * MON")) //每週一早上十點執行 .build();
最後,將哪一個job由哪一個trigger觸發安排設置進調度程序-任務執行計劃表,並啓動它。.net
schedule.scheduleJob(jobDetail1, trigger1); schedule.start();
至此,一個定時任務就寫出來了,真的很簡單。
完整代碼以下:設計
public class QuartzLoad { private static Scheduler sched; public static void run() throws Exception { //一個job能夠對應多個tigger,可是一個trigger不能對應多個job。 System.out.println("啟動定時任務"); //建立Scheduler SchedulerFactory sfact = new StdSchedulerFactory(); sched = sfact.getScheduler(); //每週一早上8點執行任務 JobDetail jobDetail1 = JobBuilder.newJob((Class<? extends Job>) TestJob.class) .withIdentity("myjob1", "group1").build(); CronTrigger trigger1 =(CronTrigger) TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("0 0 8 ? * MON")) .build(); schedule.scheduleJob(jobDetail1, trigger1); schedule.start(); } //中止 public static void stop() throws Exception{ sched.shutdown(); } }
能夠先用main方法啓動試試,若是是web項目能夠用監聽器啓動。例:code
/** * 監聽器 * */ public class TimingTaskSchedule implements ServletContextListener{ // 服務器啓動時執行該事件 public void contextInitialized(ServletContextEvent arg0) { try { QuartzLoad.run(); } catch (Exception e) { e.printStackTrace(); } } // 服務器中止時執行該事件 public void contextDestroyed(ServletContextEvent arg0) { try { QuartzLoad.stop(); } catch (Exception e) { e.printStackTrace(); } } }
Quartz提供了多種觸發器,比較經常使用的有 CronTrigger和SimpleTrigger ,建立觸發器時的時間表達式怎麼寫?見這篇博客:點擊連接orm