<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency>
能夠定義觸發的規則,好比基於時刻,時間間隔,表達式java
能夠定義須要執行的任務。好比一個腳本或者一段代碼。。。任務和規則是分開的mysql
集中管理配置愛,持久配置。linux
不把規則寫在代碼裏面,能夠看到全部的任務配置。方便維護spring
重啓以後任務能夠再次調度---配置在文件或者配置中心sql
5) 支持多個任務併發執行,互不干擾數據庫
6)有本身的調度器,能夠啓動、中斷、中止任務數據結構
7)容易集成到spring併發
# Default Properties file for use by StdSchedulerFactory # to create a Quartz Scheduler Instance, if a different # properties file is not explicitly specified. # org.quartz.scheduler.instanceName: DefaultQuartzScheduler org.quartz.scheduler.rmi.export: false org.quartz.scheduler.rmi.proxy: false org.quartz.scheduler.wrapJobExecutionInUserTransaction: false org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount: 10 org.quartz.threadPool.threadPriority: 5 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true org.quartz.jobStore.misfireThreshold: 60000 org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
public class MyTask1 implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("第一次測試quartz定時任務,當前時間: "+ TimeUtil.getCurrentTime()); } }
JobDetail jobDetail = JobBuilder.newJob(MyTask1.class) //name group 構成惟一id .withIdentity("job1","group1") .usingJobData("abc","first value") .build();
//建立trigger Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1","group1") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() //2秒執行一次 .withIntervalInSeconds(2) //不中止 .repeatForever()) .build();
SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.scheduleJob(jobDetail,trigger); scheduler.start();
實現類 | 描述 | 特色 |
---|---|---|
CalendarIntervalTriggerImpl | 基於日曆的 | |
CronTriggerImpl | 基於cron表達式 | |
DailyTimeIntervalTriggerImpl | 基於日期的 | 天天的某個時段 |
SimpleTriggerImpl | 簡單觸發器 | 固定時刻 |
SimpleTrigger 能夠定義固定時刻或者固定時間間隔的調度規則(精確到毫秒)。框架
例如:天天 9 點鐘運行;每隔 30 分鐘運行一次。maven
CalendarIntervalTrigger 能夠定義更多時間單位的調度需求,精確到秒。
好處是不須要去計算時間間隔,好比 1 個小時等於多少毫秒。
例如每一年、每月、每週、天天、每小時、每分鐘、每秒。
每一年的月數和每月的天數不是固定的,這種狀況也適用
天天的某個時間段內,以必定的時間間隔執行任務。
例如:天天早上 9 點到晚上 9 點,每隔半個小時執行一次,而且只在週一到週六執 行。
CronTirgger 能夠定義基於 Cron 表達式的調度規則,是最經常使用的觸發器類型
SchedulerFactory sf = new StdSchedulerFactory(); Scheduler scheduler = sf.getScheduler(); scheduler.start(); AnnualCalendar holidays = new AnnualCalendar(); // 排除中秋節 Calendar midAutumn = new GregorianCalendar(2019, 9, 13); holidays.setDayExcluded(midAutumn, true); // 排除聖誕節 Calendar christmas = new GregorianCalendar(2019, 12, 25); holidays.setDayExcluded(christmas, true); // 調度器添加日曆 scheduler.addCalendar("holidays", holidays, false, false); JobDetail jobDetail = JobBuilder.newJob(MyTask1.class) .withIdentity("job1", "group1") .usingJobData("gupao","青山 2673") .build(); Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .startNow() .modifiedByCalendar("holidays") .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(2) .repeatForever()) .build(); Date firstRunTime = scheduler.scheduleJob(jobDetail, trigger); System.out.println(jobDetail.getKey() + " 第一次觸發: " + firstRunTime);
Calendar 名稱 | 用法 |
---|---|
BaseCalendar | 爲高級的 Calendar 實現了基本的功能,實現了 org.quartz.Calendar 接口AnnualCalendar 排除年中一天或多天 |
CronCalendar | 日曆的這種實現排除了由給定的 CronExpression 表達的時間集合。 例如,您可使用此日曆使用表達式「* * 0-7,18-23?* *」天天排除全部營業時 間(上午 8 點至下午 5 點)。 若是 CronTrigger 具備給定的 cron 表達式並 且與具備相同表達式的 CronCalendar 相關聯,則日曆將排除觸發器包含的 全部時間,而且它們將彼此抵消 |
DailyCalendar | 您可使用此日從來排除營業時間(上午 8 點 - 5 點)天天。 每一個DailyCalendar僅容許指定單個時間範圍,而且該時間範圍可能不會跨越每日邊界(即,您不能指定從上午 8 點至凌晨 5 點的時間範圍)。 若是屬 性 invertTimeRange 爲 false(默認),則時間範圍定義觸發器不容許觸發 的時間範圍。 若是 invertTimeRange 爲 true,則時間範圍被反轉 - 也就是 排除在定義的時間範圍以外的全部時間 |
HolidayCalendar | 特別的用於從 Trigger 中排除節假日 |
MonthlyCalendar | 排除月份中的指定數天,例如,可用於排除每個月的最後一天 |
WeeklyCalendar | 排除星期中的任意周幾,例如,可用於排除週末,默認週六和週日 |
Scheduler 中的方法主要分爲三大類:
1)操做調度器自己,例如調度器的啓動 start()、調度器的關閉 shutdown()。
2)操做 Trigger,例如 pauseTriggers()、resumeTrigger()。
3)操做 Job,例如 scheduleJob()、unscheduleJob()、rescheduleJob()
檢測任務的生命週期
觀察者模式:定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則 全部依賴它的對象都會獲得通知並自動更新。
Quartz 中提供了三種 Listener,監聽 Scheduler 的,監聽 Trigger 的,監聽 Job 的。
Jobstore 用來存儲任務和觸發器相關的信息,例如全部任務的名稱、數量、狀態等 等。Quartz 中有兩種存儲任務的方式,一種在在內存,一種是在數據庫。
把任務和觸發器信息運行的信息 存儲在內存中,用到了 HashMap、TreeSet、HashSet 等等數據結構。 若是程序崩潰或重啓,全部存儲在內存中的數據都會丟失。因此咱們須要把這些數 據持久化到磁盤。
JDBC 的實現方式有兩種,JobStoreSupport 類的兩個子類:
JobStoreTX:在獨立的程序中使用,本身管理事務,不參與外部事務。
JobStoreCMT:(Container Managed Transactions (CMT),若是須要容器管理事 務時,使用它。
使用 JDBCJobSotre 時,須要配置數據庫信息:
org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate # 使用 quartz.properties,不使用默認配置 org.quartz.jobStore.useProperties:true #數據庫中 quartz 表的表名前綴 org.quartz.jobStore.tablePrefix:QRTZ_ org.quartz.jobStore.dataSource:myDS #配置數據源 org.quartz.dataSource.myDS.driver:com.mysql.jdbc.Driver org.quartz.dataSource.myDS.URL:jdbc:mysql://localhost:3306/gupao?useUnicode=true&characterEncoding=utf8 org.quartz.dataSource.myDS.user:root org.quartz.dataSource.myDS.password:123456 org.quartz.dataSource.myDS.validationQuery=select 0 from dual