Quartz是一個功能強大的開源任務調度框架,幾乎能夠繼承到任何java應用程序。Quartz能夠用來建立簡單或爲運行十個,百個,甚至是好幾萬個Jobs這樣複雜的程序。同時Quartz Scheduler包含許多企業級功能,例如對JTA事務和集羣的支持java
該實例用來在下一分鐘執行一個helloJobgit
public class HelloJobMain { public static void main(String[] args) throws Exception { // DirectSchedulerFactory directSchedulerFactory = DirectSchedulerFactory.getInstance(); //建立一個調度工廠對象,並從裏面獲取一個調度器 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); //獲取當前時間的下一分鐘 Date runTime = DateBuilder.evenMinuteDate(new Date()); //定義一個job jobkey名稱 jobkey 組 JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build(); JobDataMap jobDataMap = job.getJobDataMap(); //JobDataMap jobDataMap=new JobDataMap(); jobDataMap.put("zhangsan",23); //定義一個定時器 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build(); scheduler.getContext().put("lisi",24); scheduler.scheduleJob(job, trigger); scheduler.start(); Thread.sleep(65L * 1000L); scheduler.shutdown(true); } }
public class HelloJob implements Job { /** * @param jobExecutionContext * @throws JobExecutionException */ @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("HelloJob 任務執行啦"); JobDetail jobDetail = jobExecutionContext.getJobDetail(); JobKey key = jobDetail.getKey(); Trigger trigger = jobExecutionContext.getTrigger(); TriggerKey key1 = trigger.getKey(); JobDataMap mergedJobDataMap = jobExecutionContext.getMergedJobDataMap(); System.out.println(mergedJobDataMap.get("zhangsan")); SchedulerContext context = null; try { context = jobExecutionContext.getScheduler().getContext(); } catch (SchedulerException e) { e.printStackTrace(); } System.out.println(context.get("lisi")); } }
上面代碼是建立一個Job的基本步驟,即包括:github
一、建立SchedulerFactory工廠對象,並從中獲取一個Schedulerspring
二、建立一個JobDetail框架
三、建立一個觸發器即Triggeride
四、註冊到Scheduler,即scheduler.scheduleJob(job, trigger);ui
五、啓動Scheduler,即scheduler.start();線程
Job:是一個接口,裏面有一個方法public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException,開發者在開發調度任務的時候,只須要實現該接口便可。JobExecutionContext類提供了調度上下文的各類信息。Job運行時的信息保存在JobDataMap,也能夠保存在SchedulerContext中。code
JobDetail:傳遞給定Job實例的詳細信息,包括Job名字以及所屬的組對象
Trigger:觸發Job執行的時間的規則。主要有CalendarIntervalTrigger,CronTrigger,DailyTimeIntervalTrigger,SimpleTrigger,經常使用的有SimpleTrigger和CronTrigger兩個。
CalendarIntervalTrigger:按照固定的時間間隔來觸發任務。好比:使用月做爲間隔單位,不當心設置爲月底的最後一天,好比1月31號,Trigger的Unit爲month,interval是1,則下一個觸發爲2月28號,以後再次觸發爲3月28號,依次類推。
DailyTimeIntervalTrigger:跟CalendarIntervalTrigger相似,好比:Trigger設置在8:00~11:00之間,每72分鐘執行一次,則執行時間爲8:00, 9:12, 10:24,下次執行時間爲次日的8:00, 9:12, 10:24。
CronTrigger:按照Cron表達式給定的時間觸發任務
SimpleTrigger:用來觸發只需執行一次或者在給定時間觸發而且重複N次且每次執行延遲必定時間的任務。
Scheduler:表明一個Quartz的獨立運行容器,Trigger和JobDetail能夠註冊到Scheduler中,二者在Scheduler中擁有各自的組及名稱,組及名稱是Scheduler查找定位容器中某一對象的依據,Trigger的組及名稱必須惟一,JobDetail的組和名稱也必須惟一(但能夠和Trigger的組和名稱相同,由於它們是不一樣類型的)。Scheduler定義了多個接口方法,容許外部經過組及名稱訪問和控制容器中Trigger和JobDetail。
ThreadPool:Scheduler使用一個線程池做爲任務運行的基礎設施,任務經過共享線程池中的線程提升運行效率。
JobStore: 經過類實現的接口,這些類要爲org.quartz.core.QuartzScheduler的使用提供一個org.quartz.Job和org.quartz.Trigger存儲機制。做業和觸發器的存儲應該以其名稱和組的組合爲惟一性。
QuartzSchedulerResources:包含建立QuartzScheduler實例所需的全部資源(JobStore,ThreadPool等)。
SchedulerFactory :提供用於獲取調度程序實例的客戶端可用句柄的機制
QuartzSchedulerThread:負責執行向QuartzScheduler註冊的觸發Trigger的工做的線程。
結構: corn從左到右(用空格隔開):秒 分 小時 月份中的日期 月份 星期中的日期 年份
字段 | 容許值 | 容許特殊字符 |
---|---|---|
Seconds | 0-59 | , - * / |
Minutes | 0-59 | , - * / |
Hours | 0-23 | , - * / |
Day-of-month | 1-31 | , - * ? / L W |
Month | 0-11 or JAN-DEC | , - * / |
Day-of-Week | 1-7 or SUN-SAT | , - * ? / L # |
Year (Optional) | empty, 1970-2199 | , - * / |
*號:表明任意的值,好比:在minutes表明任意每一分鐘
?號:用於day-of-month 和 day-of-week,表示不匹配任何值
-號:好比用在hour字段,10-12 表示匹配10,11,12
,號:表示枚舉值,好比在day-of-week:MON,WED,FRI表明Monday, Wednesday, 和Friday
/號: 表示起始時間開始觸發,而後每隔固定時間觸發一次。例如在Minutes域使用5/20,則意味着5分鐘觸發一次,而25,45等分別觸發一次.
L號:表示最後,用在day-of-month 和day-of-week, 若是在day-of-week域使用5L,意味着在最後的一個星期四觸發。
W號:表示有效工做日(週一到週五),只能出如今DayofMonth域,系統將在離指定日期的最近的有效工做日觸發事件。例如:在 DayofMonth使用5W,若是5日是星期六,則將在最近的工做日:星期五,即4日觸發。若是5日是星期天,則在6日(週一)觸發;若是5日在星期一到星期五中的一天,則就在5日觸發。另一點,W的最近尋找不會跨過月份 。
LW號:這兩個字符能夠連用,表示在某個月最後一個工做日,即最後一個星期五。
#號:用於肯定每月第幾個星期幾,只能出如今DayofMonth域。例如在4#2,表示某月的第二個星期三。
表達式 | 含義 |
---|---|
0 0 12 * * ? | 表示天天12點執行 |
0 15 10 ? * * | 天天10:15am執行 |
0 15 10 * * ? | 天天10:15am執行 |
0 15 10 * * ? * | 天天10:15am執行 |
0 15 10 * * ? 2005 | 2005年天天10:15am執行 |
0 * 14 * * ? | 天天從2:00pm到2:59pm每分鐘執行 |
0 0/5 14 * * ? | 天天從2:00pm到2:59pm每5分鐘執行 |
0 0/5 14,18 * * ? | 天天2:00pm到2:59pm和6:00pm到6:59pm,每5分鐘執行一次 |
0 0-5 14 * * ? | 天天2:00pm到2:05pm每分鐘執行 |
0 10,44 14 ? 3 WED | 每一年三月的星期三的下午2:10和2:44觸發 |
0 15 10 ? * MON-FRI | 週一至週五的上午10:15觸發 |
0 15 10 15 * ? | 每個月15日上午10:15觸發 |
0 15 10 L * ? | 每個月最後一日的上午10:15觸發 |
0 15 10 ? * 6L | 每個月的最後一個星期五上午10:15觸發 |
0 15 10 ? * 6L 2002-2005 | 2002年至2005年的每個月的最後一個星期五上午10:15觸發 |
0 15 10 ? * 6#3 | 每個月的第三個週五上午10:15觸發 |