quartz學習記錄

maven

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
</dependency>

任務調度需求分析

1.基本需求

  1. 能夠定義觸發的規則,好比基於時刻,時間間隔,表達式java

  2. 能夠定義須要執行的任務。好比一個腳本或者一段代碼。。。任務和規則是分開的mysql

  3. 集中管理配置愛,持久配置。linux

​ 不把規則寫在代碼裏面,能夠看到全部的任務配置。方便維護spring

​ 重啓以後任務能夠再次調度---配置在文件或者配置中心sql

  1. 支持任務的串行執行

5) 支持多個任務併發執行,互不干擾數據庫

6)有本身的調度器,能夠啓動、中斷、中止任務數據結構

7)容易集成到spring併發

2. 任務調度工具

  1. linux的crontab 執行簡單的腳本命令
  2. JDK Timer(單線程) ScheduledThreadPool
  3. 容器 spring Task @Scheduled
  4. 分佈式框架 XXL-JOB Elastic-Job

quartz優勢

  • 精確到毫秒級別的調度
  • 能夠獨立運行,也能夠集成到容器中
  • 支持事務
  • 支持集羣
  • 支持持久化

quartz默認配置

# 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

第一個demo

1.建立job

public class MyTask1 implements Job {


    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("第一次測試quartz定時任務,當前時間: "+ TimeUtil.getCurrentTime());
    }
}

2.建立jobDetail任務信息

JobDetail jobDetail = JobBuilder.newJob(MyTask1.class)
    //name  group 構成惟一id
    .withIdentity("job1","group1")
    .usingJobData("abc","first value")
    .build();

3.建立trigger觸發器

//建立trigger
Trigger trigger = TriggerBuilder.newTrigger()
    .withIdentity("trigger1","group1")
    .startNow()
    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                  //2秒執行一次
                  .withIntervalInSeconds(2)
                  //不中止
                  .repeatForever())
    .build();

4.建立Scheduler 調度器

SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();

5.結構圖

trigger的四個實現類

實現類 描述 特色
CalendarIntervalTriggerImpl 基於日曆的
CronTriggerImpl 基於cron表達式
DailyTimeIntervalTriggerImpl 基於日期的 天天的某個時段
SimpleTriggerImpl 簡單觸發器 固定時刻

1.SimpleTrigger

SimpleTrigger 能夠定義固定時刻或者固定時間間隔的調度規則(精確到毫秒)。框架

例如:天天 9 點鐘運行;每隔 30 分鐘運行一次。maven

2.CalendarIntervalTrigger

CalendarIntervalTrigger 能夠定義更多時間單位的調度需求,精確到秒。

好處是不須要去計算時間間隔,好比 1 個小時等於多少毫秒。

例如每一年、每月、每週、天天、每小時、每分鐘、每秒。

每一年的月數和每月的天數不是固定的,這種狀況也適用

3.DailyTimeIntervalTrigger

天天的某個時間段內,以必定的時間間隔執行任務。

例如:天天早上 9 點到晚上 9 點,每隔半個小時執行一次,而且只在週一到週六執 行。

4.CronTrigger

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 調度器

Scheduler 中的方法主要分爲三大類:

1)操做調度器自己,例如調度器的啓動 start()、調度器的關閉 shutdown()。

2)操做 Trigger,例如 pauseTriggers()、resumeTrigger()。

3)操做 Job,例如 scheduleJob()、unscheduleJob()、rescheduleJob()

Listener

檢測任務的生命週期

觀察者模式:定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則 全部依賴它的對象都會獲得通知並自動更新。

Quartz 中提供了三種 Listener,監聽 Scheduler 的,監聽 Trigger 的,監聽 Job 的。

1. JobListener

2.TriggerListener

3.SchedulerListener

JobStore

Jobstore 用來存儲任務和觸發器相關的信息,例如全部任務的名稱、數量、狀態等 等。Quartz 中有兩種存儲任務的方式,一種在在內存,一種是在數據庫。

RAMJobStore

把任務和觸發器信息運行的信息 存儲在內存中,用到了 HashMap、TreeSet、HashSet 等等數據結構。 若是程序崩潰或重啓,全部存儲在內存中的數據都會丟失。因此咱們須要把這些數 據持久化到磁盤。

JDBCJobStore

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
相關文章
相關標籤/搜索