(优秀文章保存)Quartz优秀文章保存
Quartz的基本使用之入門(2.3.0版本)
一、Quartz可以用來做什么
Quartz是一個強大任務調(diào)度框架,我工作時候會在這些情況下使用到quartz框架,當然還有很多的應用場景,在這里只列舉2個實際用到的
- 餐廳系統(tǒng)會在每周四晚上的22點自動審核并生成報表
-
人事系統(tǒng)會在每天早晨8點給有待辦的人員自動發(fā)送Email提醒
二、使用Quartz之前的準備
1.建立一個Maven項目
2.引入quartz的依賴
使用quartz,我們僅僅需要在maven的pom文件中添加依賴即可。我使用的是現(xiàn)在最新的一個版本2.3.0,大家可以在maven的倉庫獲取到最新的版本依賴,地址:http://mvnrepository.com/artifact/org.quartz-scheduler/quartz
? 但然也可以使用這個2.3.0的依賴,下面的例子都是使用此依賴并實現(xiàn)了效果。
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz --> <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.0</version> </dependency>三、編寫第一個Quartz任務案例 -?每隔2秒鐘打印一次HelloQuartz
先實現(xiàn)一下這個基本的Quartz的任務再來介紹一下Quartz的3個重要組成,JobDetail,Trigger,Scheduler
1.創(chuàng)建一個類 HelloJob.java,這個類是編寫我們的具體要實現(xiàn)任務(打印Hello Quartz)
import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException;import java.text.SimpleDateFormat; import java.util.Date; public class HelloJob implements Job{public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {//打印當前的執(zhí)行時間 例如 2017-11-23 00:00:00Date date = new Date();SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("現(xiàn)在的時間是:"+ sf.format(date));//具體的業(yè)務邏輯System.out.println("Hello Quartz");} }2.創(chuàng)建一個類HelloScheduler.java,這個是具體觸發(fā)我們的任務
public class HelloScheduler {public static void main(String[] args) throws SchedulerException {//創(chuàng)建一個jobDetail的實例,將該實例與HelloJob Class綁定JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob").build();//創(chuàng)建一個Trigger觸發(fā)器的實例,定義該job立即執(zhí)行,并且每2秒執(zhí)行一次,一直執(zhí)行SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();//創(chuàng)建schedule實例StdSchedulerFactory factory = new StdSchedulerFactory();Scheduler scheduler = factory.getScheduler();scheduler.start();scheduler.scheduleJob(jobDetail,trigger);} }3.執(zhí)行main方法,Run 'HelloScheduler.main()',可以看見如下效果,表明任務執(zhí)行成功了
4.一句話看懂quartz
?? 1、創(chuàng)建調(diào)度工廠(); ? ?//工廠模式
? ?2、根據(jù)工廠取得調(diào)度器實例(); ? //工廠模式
? ?3、Builder模式構建子組件<Job,Trigger> ?//?builder模式, 如JobBuilder、TriggerBuilder、DateBuilder
? ?4、通過調(diào)度器組裝子組件 ? 調(diào)度器.組裝<子組件1,子組件2...> ? //工廠模式
? ?5、調(diào)度器.start(); ?//工廠模式
?
?四、第二個案例 -??每日的9點40分觸發(fā)任務打印HelloQuartz
與上一個的簡單案例的區(qū)別在于,SimpleTrigger/CronTrigger. 簡單的定時任務,可以采用SimpleTrigger,復雜的任務一般采用CronTrigger.cronTrigger不僅可以設定單的觸發(fā)時間表,更可以設定非常復雜的觸發(fā)時間表。 CronTrigger 是基于 Unix類似于 cron 表達式,如果對cron表達式比較熟悉,那么學習起來經(jīng)非常簡單. 即使對cron表達式不熟悉,花一會兒的功夫也可以學會。(在工作中我們直接使用網(wǎng)上的在線生成表達式即可又快又準確)生成地址:http://cron.qqe2.com/
先上代碼,然后介紹一下cron表達式生成規(guī)則。
1.編寫任務類 HelloJob.java,具體情況編寫具體內(nèi)容,如生成報表,發(fā)送郵件。。
public class HelloJob implements Job{public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {//打印當前的執(zhí)行時間 例如 2017-11-22 00:00:00Date date = new Date();SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("現(xiàn)在的時間是:"+ sf.format(date));//具體的業(yè)務邏輯System.out.println("開始生成任務報表 或 開始發(fā)送郵件");} }?2.編寫任務觸發(fā)類? CronScheduler.java
public class CronScheduler {public static void main(String[] args) throws SchedulerException, InterruptedException {//jobDetailJobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("cronJob").build();//cronTrigger//每日的9點40觸發(fā)任務CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("cronTrigger").withSchedule(CronScheduleBuilder.cronSchedule("0 40 9 * * ? ")).build();//1.每日10點15分觸發(fā) 0 15 10 ?* *//2.每天下午的2點到2點59分(正點開始,隔5分觸發(fā)) 0 0/5 14 * * ?//3.從周一到周五每天的上午10點15觸發(fā) 0 15 10 ? MON-FRI//4.每月的第三周的星期五上午10點15觸發(fā) 0 15 10 ? * 6#3//5.2016到2017年每月最后一周的星期五的10點15分觸發(fā) 0 15 10 ? * 6L 2016-2017//Scheduler實例StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();Scheduler scheduler = stdSchedulerFactory.getScheduler();scheduler.start();scheduler.scheduleJob(jobDetail,cronTrigger);} }?
quartz定時任務時間設置
每天凌晨2點 ?0 0 2 * * ?和每天隔一小時 0 * */1 * * ?
例1:每隔5秒執(zhí)行一次:*/5 * * * * ?
例2:每隔5分執(zhí)行一次:0 */5 * * * ?
在26分、29分、33分執(zhí)行一次:0 26,29,33 * * * ?
例3:每天半夜12點30分執(zhí)行一次:0 30 0 * * ? (注意日期域為0不是24)
每天凌晨1點執(zhí)行一次:0 0 1 * * ?
每天上午10:15執(zhí)行一次: 0 15 10 ? * * 或 0 15 10 * * ? 或 0 15 10 * * ? *
每天中午十二點執(zhí)行一次:0 0 12 * * ?
每天14點到14:59分,每1分鐘執(zhí)行一次:0 * 14 * * ?
每天14點到14:05分,每1分鐘執(zhí)行一次:0 0-5 14 * * ?
每天14點到14:55分,每5分鐘執(zhí)行一次:0 0/5 14 * * ?
每天14點到14:55分,和18點到18點55分,每5分鐘執(zhí)行一次:0 0/5 14,18 * * ?
每天18點執(zhí)行一次:0 0 18 * * ?
每天18點、22點執(zhí)行一次:0 0 18,22 * * ?
每天7點到23點,每整點執(zhí)行一次:0 0 7-23 * * ?
每個整點執(zhí)行一次:0 0 0/1 * * ?
轉(zhuǎn)載地址:
https://www.cnblogs.com/zhanghaoliang/p/7886110.html
總結
以上是生活随笔為你收集整理的(优秀文章保存)Quartz优秀文章保存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载保存】linux shell字符串
- 下一篇: lucene6.0 查询语句设置关键字b