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