quartz定時任務調度框架

1.quartz的基本認識與結構類

QuartzSchedulerThread :負責執行向QuartzScheduler註冊的觸發Trigger的工作的線程。 

ThreadPool:Scheduler使用一個線程池作爲任務運行的基礎設施,任務通過共享線程池中的線程提供運行效率。 

QuartzSchedulerResources:包含創建QuartzScheduler實例所需的所有資源(JobStore,ThreadPool等)。 

SchedulerFactory :提供用於獲取調度程序實例的客戶端可用句柄的機制。 

JobStore: 通過類實現的接口,這些類要爲org.quartz.core.QuartzScheduler的使用提供一個org.quartz.Job和org.quartz.Trigger存儲機制。作業和觸發器的存儲應該以其名稱和組的組合爲唯一性。 

QuartzScheduler :這是Quartz的核心,它是org.quartz.Scheduler接口的間接實現,包含調度org.quartz.Jobs,註冊org.quartz.JobListener實例等的方法。 

Scheduler :這是Quartz Scheduler的主要接口,代表一個獨立運行容器。調度程序維護JobDetails和觸發器的註冊表。 一旦註冊,調度程序負責執行作業,當他們的相關聯的觸發器觸發(當他們的預定時間到達時)。 

Trigger :具有所有觸發器通用屬性的基本接口,描述了job執行的時間出發規則。 - 使用TriggerBuilder實例化實際觸發器。 

JobDetail :傳遞給定作業實例的詳細信息屬性。 JobDetails將使用JobBuilder創建/定義。 

Job:要由表示要執行的“作業”的類實現的接口。只有一個方法 void execute(jobExecutionContext context) 

(jobExecutionContext 提供調度上下文各種信息,運行時數據保存在jobDataMap中) 

Job有個子接口StatefulJob ,代表有狀態任務。 

有狀態任務不可併發,前次任務沒有執行完,後面任務處於阻塞等到。

 

 

2.spring整合quartz的完整流程

 

https://www.cnblogs.com/ealenxie/p/9134602.html

1.導入相關依賴

 

2.創建相關係統表(大概會有11張表好像),腳本可以從quartz官方來提供

(存儲jobdetail,job,trigger等信息,以便將數據庫持久化到數據庫宕機時候可以取出)

 

3.配置文件的相關配置

重要配置信息

//持久化方式 可以配置內存存儲或者數據庫存儲 ramJobStore 與JDBCJobstore

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreT

 

quartz有兩種基本的作業存儲類型

1.RAMJobStore:默認情況下Quartz會將任務調度存在內存中,這種方式性能是最好的,因爲內存的速度是最快的。不好的地方就是數據缺乏持久性,但程序崩潰或者重新發布的時候,所有運行信息都會丟失

2.JDBC作業存儲:存到數據庫之後,可以做單點也可以做集羣,當任務多了之後,可以統一進行管理。關閉或者重啓服務器,運行的信息都不會丟失。缺點就是運行速度快慢取決於連接數據庫的快慢

 

 

3.quartz整合項目的時候遇到的坑

 

1.@DisallowConcurrentExecution:該註解是標記在實現Job接口的類上面的,作用是不允許

同一個JobDetail併發執行,但是不同的JobDetail還是會併發執行

比如 一個HelloJob,其中的任務可能要執行10秒,但是你定義了沒8秒執行一次,那麼第一次還沒執行完畢,第二次又會疊加在第一次執行,耗費資源(且也沒有按照我們規定的時間間隔執行) 。使用@disallowConcurrentExecution註解就會等第一次執行完之後,再執行

@PersistJobDataAfterExecution 同樣, 也是加在Job上,表示當正常執行完Job後, JobDataMap中的數據應該被改動, 以被下一次調用時用。當使用@PersistJobDataAfterExecution 註解時, 爲了避免併發時, 存儲數據造成混亂, 強烈建議把@DisallowConcurrentExecution註解也加上。

2.Job對象的實例化過程是在Quartz中進行的,如何放在spring容器中進行管理呢?

quartz中定義了一個JObFactory接口,那麼我們通過實現JobFactory 接口,在實例化Job以後,在通過ApplicationContext 將Job所需要的屬性注入即可。

3.一個job可以被多個Trigger 綁定,但是一個Trigger只能綁定一個job!

4.quartz中的group相當於命名空間一樣

5.quartz對異常的處理:本次異常不會影響下一次的執行

6.配置文件相關

#使用自己的配置文件

org.quartz.jobStore.useProperties:true

 

#默認或是自己改名字都行

org.quartz.scheduler.instanceName: DefaultQuartzScheduler

#如果使用集羣,instanceId必須唯一,設置成AUTO

org.quartz.scheduler.instanceId = AUTO

 

#配置線程池

org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool

org.quartz.threadPool.threadCount: 10

org.quartz.threadPool.threadPriority: 5

org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true

 

 

#存儲方式使用JobStoreTX,也就是數據庫

org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX

org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate

#是否使用集羣(如果項目只部署到 一臺服務器,就不用了)

org.quartz.jobStore.isClustered = false

org.quartz.jobStore.clusterCheckinInterval=20000

org.quartz.jobStore.tablePrefix = qrtz_

org.quartz.jobStore.dataSource = myDS

 

#配置數據源

#數據庫中quartz表的表名前綴

org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver

org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/aipyun?serverTimezone=GMT&characterEncoding=utf-8

org.quartz.dataSource.myDS.user = root

org.quartz.dataSource.myDS.password = root123

org.quartz.dataSource.myDS.maxConnections = 5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章