【Quartz】01 快速上手
阿新 • • 發佈:2020-09-12
一、Quartz概述
Quartz是用來做定時任務排程的JavaEE框架
需求場景:
1、在每個月末,自動網易雲會員續費,或者百度雲盤會員續費
2、在迅雷下載完一個超過10G的資源的30秒之後自動關機
也就是說我們希望在某一個特定的時刻,去執行一些事情
二、快速入門
POM座標:
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency>
開啟右側的Maven選單工具,可以看到Quartz的依賴項,包含了兩個資料來源
編寫一個類並且實現Job介面,重寫介面的execute方法
package cn.dzz.quartz; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; /** * @authorEcho42 * @file Quartz * @create 2020年09月12日16:53 * @description */ public class HelloQuartz implements Job { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 我們希望執行的邏輯 System.out.println("Hello Quartz !!!"); } }
編寫可執行的方法【Main或者JunitTest】
package cn.dzz; import cn.dzz.quartz.HelloQuartz; import org.junit.Test; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import java.util.GregorianCalendar; /** * @author Echo42 * @file Quartz * @create 2020年09月12日16:56 * @description */ public class QuartzTest { @Test public void testQuartzSample() throws SchedulerException { // 1、排程器物件 Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler(); // 2、觸發器物件 ,指定執行事件如何觸發 SimpleTrigger simpleTrigger = TriggerBuilder. newTrigger(). // 建立新的觸發器 withIdentity("trigger01", "group01"). // 觸發器例項的標識資訊 startNow(). // 從什麼時候開始觸發執行 withSchedule( // 如何排程執行的規則 SimpleScheduleBuilder. simpleSchedule(). withIntervalInSeconds(10). repeatForever() ). endAt( // 從什麼時候結束執行 new GregorianCalendar(2020, 10, 2, 14, 26, 33). getTime() ). build(); // 3、職責詳細 JobDetail JobDetail jobDetail = JobBuilder.newJob(HelloQuartz.class).withIdentity("trigger01", "group01").build(); // 4、把職責詳細物件和觸發器物件注入到排程器物件中 defaultScheduler.scheduleJob(jobDetail, simpleTrigger); // 5、啟動排程器 defaultScheduler.start(); } }
單元測試的結果,沒反應?直接結束了
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Process finished with exit code 0
換成main執行:
這才有效了。。。。
執行的上下文引數:
package cn.dzz.quartz; import org.quartz.*; /** * @author Echo42 * @file Quartz * @create 2020年09月12日16:53 * @description */ public class HelloQuartz implements Job { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 我們希望執行的邏輯 System.out.println("Hello Quartz !!!"); // 除此之外,還可以獲取呼叫此Job類的標識 JobDetail jobDetail = jobExecutionContext.getJobDetail(); JobKey jobDetailKey = jobDetail.getKey(); String name = jobDetailKey.getName(); // trigger01 String group = jobDetailKey.getGroup(); // group01 } }
Quartz的外部配置檔案:
# quartz.properties 不可以更改配置檔名稱,預設位置classpath目錄下面。 # 如果沒有此配置檔案,Quartz會按照預設配置執行 # 指定排程器名稱,非實現類? org.quartz.scheduler.instanceName = DefaultQuartzScheduler # 指定執行緒池實現類 org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool # 執行緒池數量 org.quartz.threadPool.threadCount = 10 # 優先順序,預設5 org.quartz.threadPool.threadPriority = 5 # 非持久化job org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
核心類:
1、Scheduler 排程器,控制所有排程,Quartz的核心API,管理了所有任務
2、Job 任務,即我們希望Quartz管理的業務邏輯定義
3、JobDetail 任務詳細,對Job物件的進一步封裝,指定更詳細的屬性
4、Trigger 觸發器,繫結任務,規定任務執行的觸發規則
三、兩種觸發器:
SimpleTrigger & CronTrigger
1、SimpleTrigger 以一定時間範圍內執行的任務,指定起始時間和截止時間,指定時間間隔與次數
// 2、觸發器物件 ,指定執行事件如何觸發 SimpleTrigger simpleTrigger = TriggerBuilder. newTrigger(). // 建立新的觸發器 withIdentity("trigger01", "group01"). // 觸發器例項的標識資訊 startNow(). // 從什麼時候開始觸發執行 withSchedule( // 如何排程執行的規則 SimpleScheduleBuilder. simpleSchedule(). // withIntervalInSeconds(10). repeatForever() ). endAt( // 從什麼時候結束執行 new GregorianCalendar(2020, 10, 2, 14, 26, 33). getTime() ). build();
2、用來規定更為複雜的觸發規則,支援Linux Cron的語法,
只需要Cron表示式即可
private static void cronExpressionQuartzDemo() { try { Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler(); CronTrigger cronTrigger = TriggerBuilder. newTrigger(). withIdentity("trigger02", "group02"). withSchedule( // cron 表示式 秒 分 時 日 月 周 年 // 年可以省略 // 10月 22日 16時 34分 20秒 // ? 問號表示不明確,但是我們上述的內容可以讓Quartz自行推算具體值 CronScheduleBuilder.cronSchedule("20 34 16 22 10 ?") // CronScheduleBuilder.cronSchedule("20 34 16 22 10 ?") 在這個表示式規定這個時刻執行一次 // 把任意的一個表示式計量值 換成 * 表示在這個時間單位上進行重複的執行 // 例如 "* 34 16 22 10 ?" 表示每秒執行 // 同理可以 每分鐘,每小時,每天,每個星期,每個月,或者最後到每年 // 使用 */n 表示每時間單位計量值的N倍,再執行 // 例如 "*/2 34 16 22 10 ?" 每兩秒執行一次 ).build(); JobDetail jobDetail = JobBuilder.newJob(HelloQuartz.class).withIdentity("trigger01", "group01").build(); defaultScheduler.scheduleJob(jobDetail, null); defaultScheduler.start(); } catch (Exception exception) { exception.printStackTrace(); } }
Cron表示式詳細參考:
https://www.cnblogs.com/yanghj010/p/10875151.html
Spring整合Quartz就沒再繼續寫了,配置麻煩
視訊參考:
https://www.bilibili.com/video/BV1zz4y1X71Z