要學習Quartz框架,首先大概瞭解了Quartz的基本知識後,在經過簡單的例子入門,一步一個腳印的走下去。
下面介紹Quartz入門的示例,因爲Quartz的存儲方式分爲RAM和JDBC,分別對這兩種進行簡單的說明。並附上代碼!
首先須要添加Quartz的Jar包 ,我使用的是quartz.2.2.1版本!
Demo代碼下載地址:quartz-studyjava
<!-- quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.1</version> </dependency>
1:RAM方式
要測試RAMdemo的代碼,請先刪除demo中這個quartz.properties文件,或者重命名!不然會測試不成功!
(1):Jobmysql
package com.liuzhihu.learn; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author liuzhihu * */ public class RAMJob implements Job { private static Logger _log = LoggerFactory.getLogger(RAMJob.class); @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { _log.info("Say hello to Quartz" + new Date()); } }
(2):RAMQuartzgit
package com.liuzhihu.learn; import java.util.Date; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /*** * * @author liuzhihu * */ public class RAMQuartz { private static Logger _log = LoggerFactory.getLogger(RAMQuartz.class); public static void main(String[] args) throws SchedulerException { // 1.建立Scheduler的工廠 SchedulerFactory sf = new StdSchedulerFactory(); // 2.從工廠中獲取調度器實例 Scheduler scheduler = sf.getScheduler(); // 3.建立JobDetail JobDetail jb = JobBuilder.newJob(RAMJob.class).withDescription("this is a ram job") // job的描述 .withIdentity("ramJob", "ramGroup") // job 的name和group .build(); // 任務運行的時間,SimpleSchedle類型觸發器有效 long time = System.currentTimeMillis() + 3 * 1000L; // 3秒後啓動任務 Date statTime = new Date(time); // 4.建立Trigger // 使用SimpleScheduleBuilder或者CronScheduleBuilder Trigger t = TriggerBuilder.newTrigger().withDescription("").withIdentity("ramTrigger", "ramTriggerGroup") .withSchedule(SimpleScheduleBuilder.simpleSchedule()) .startAt(statTime) // 默認當前時間啓動 //.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) // 兩秒執行一次 .build(); // 5.註冊任務和定時器 scheduler.scheduleJob(jb, t); // 6.啓動 調度器 scheduler.start(); _log.info("啓動時間 : " + new Date()); } }
運行結果:
SimpleScheduleBuilder:github
CronScheduleBuilder:sql
2.JDBC方式數據庫
使用jdbc方式,就要配置quartz.properties文件,而且在開始的時候在數據庫中新增表!
我使用的數據庫是mysql,數據庫中表在quartz_demo裏面有,須要的請在裏面下載!
運行 tables_db2_v8.sql 這個文件。框架
#JDBC驅動 org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/quartz_test org.quartz.dataSource.qzDS.user:root org.quartz.dataSource.qzDS.password:root org.quartz.dataSource.qzDS.maxConnection:10
(1)MyJobide
package com.liuzhihu.jdbctest; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /*** * * @author liuzhihu * */ public class MyJob implements Job { private static final Logger log = LoggerFactory.getLogger(MyJob.class); public void execute(JobExecutionContext context) throws JobExecutionException { log.info("MyJob is start .................."); log.info("Hello quzrtz " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ").format(new Date())); log.info("MyJob is end ....................."); } }
(2)QuartzJdbcTest學習
package com.liuzhihu.jdbctest; import java.text.ParseException; import java.util.List; import org.quartz.CronTrigger; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.SimpleTrigger; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; /*** * * @author liuzhihu * */ public class QuartzJdbcTest { public static void main(String[] args) throws SchedulerException, ParseException { startSchedule(); // resumeJob(); } /** * 開始一個simpleSchedule()調度 */ public static void startSchedule() { try { // 一、建立一個JobDetail實例,指定Quartz JobDetail jobDetail = JobBuilder.newJob(MyJob.class) // 任務執行類 .withIdentity("job1_1", "jGroup1") // 任務名,任務組 .build(); // 觸發器類型 SimpleScheduleBuilder builder = SimpleScheduleBuilder // 設置執行次數 .repeatSecondlyForTotalCount(5); // CronScheduleBuilder builder = // CronScheduleBuilder.cronSchedule("0/2 * * * * ?"); // 二、建立Trigger Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1_1", "tGroup1").startNow() .withSchedule(builder).build(); // 三、建立Scheduler Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); // 四、調度執行 scheduler.scheduleJob(jobDetail, trigger); try { Thread.sleep(60000); } catch (InterruptedException e) { e.printStackTrace(); } // 一分鐘後,關閉調度器 scheduler.shutdown(); } catch (SchedulerException e) { e.printStackTrace(); } } /** * 從數據庫中找到已經存在的job,並從新開戶調度 */ public static void resumeJob() { try { SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); JobKey jobKey = new JobKey("job1_1", "jGroup1"); List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey); // SELECT TRIGGER_NAME, TRIGGER_GROUP FROM {0}TRIGGERS WHERE // SCHED_NAME = {1} AND JOB_NAME = ? AND JOB_GROUP = ? // 從新恢復在jGroup1組中,名爲job1_1的 job的觸發器運行 if (triggers.size() > 0) { for (Trigger tg : triggers) { // 根據類型判斷 if ((tg instanceof CronTrigger) || (tg instanceof SimpleTrigger)) { // 恢復job運行 scheduler.resumeJob(jobKey); } } scheduler.start(); } } catch (Exception e) { e.printStackTrace(); } } }
運行結果: 測試
控制檯打印:
Cron和Simple類型,Simple類型的若是JobDetail沒有設置.storeDurably(true),則job在運行完成以後會在數據庫中刪除!
原文地址:http://blog.csdn.net/u010648555/article/details/54863394