quartz 定時任務的總結(一)


1. 介紹 
Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,是完全由java開發的一個開源的任務日程管理系統,“任務進度管理器”就是一個在預先確定(被納入日程)的時間到達時,負責執行(或者通知)其他軟件組件的系統。 
Quartz用一個小Java庫發布文件(.jar文件),這個庫文件包含了所有Quartz核心功能。這些功能的主要接口(API)是Scheduler接口。它提供了簡單的操作,例如:將任務納入日程或者從日程中取消,開始/停止/暫停日程進度。 
2. 定時器種類 
Quartz 中五種類型的 Trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,NthIncludedDayTrigger和Calendar 類( org.quartz.Calendar)。 
最常用的: 
SimpleTrigger:用來觸發只需執行一次或者在給定時間觸發並且重復N次且每次執行延遲一定時間的任務。 
CronTrigger:按照日歷觸發,例如“每個周五”,每個月10日中午或者10:15分。 
3. 存儲方式 
RAMJobStore和JDBCJobStore 
對比:

類型 優點 缺點
RAMJobStore 不要外部數據庫,配置容易,運行速度快 因為調度程序信息是存儲在被分配給JVM的內存里面,所以,當應用程序停止運行時,所有調度信息將被丟失。另外因為存儲到JVM內存里面,所以可以存儲多少個Job和Trigger將會受到限制
JDBCJobStore 支持集群,因為所有的任務信息都會保存到數據庫中,可以控制事物,還有就是如果應用服務器關閉或者重啟,任務信息都不會丟失,並且可以恢復因服務器關閉或者重啟而導致執行失敗的任務 運行速度的快慢取決與連接數據庫的快慢

4. 表關系和解釋

  • 表關系

    這里寫圖片描述

  • 解釋

表名稱 說明
qrtz_blob_triggers Trigger作為Blob類型存儲(用於Quartz用戶用JDBC創建他們自己定制的Trigger類型,JobStore 並不知道如何存儲實例的時候)
qrtz_calendars 以Blob類型存儲Quartz的Calendar日歷信息, quartz可配置一個日歷來指定一個時間范圍
qrtz_cron_triggers 存儲Cron Trigger,包括Cron表達式和時區信息。
qrtz_fired_triggers 存儲與已觸發的Trigger相關的狀態信息,以及相聯Job的執行信息
qrtz_job_details 存儲每一個已配置的Job的詳細信息
qrtz_locks 存儲程序的非觀鎖的信息(假如使用了悲觀鎖)
qrtz_paused_trigger_graps 存儲已暫停的Trigger組的信息
qrtz_scheduler_state 存儲少量的有關 Scheduler的狀態信息,和別的 Scheduler 實例(假如是用於一個集群中)
qrtz_simple_triggers 存儲簡單的 Trigger,包括重復次數,間隔,以及已觸的次數
qrtz_triggers 存儲已配置的 Trigger的信息
qrzt_simprop_triggers  

5. 核心類和關系

  1. 核心類 
    (1)核心類 
    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. 關系-自己理解

這里寫圖片描述

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

6. 配置文件 
quartz.properties 
//調度標識名 集群中每一個實例都必須使用相同的名稱 (區分特定的調度器實例) 
org.quartz.scheduler.instanceName:DefaultQuartzScheduler 
//ID設置為自動獲取 每一個必須不同 (所有調度器實例中是唯一的) 
org.quartz.scheduler.instanceId :AUTO 
//數據保存方式為持久化 
org.quartz.jobStore.class :org.quartz.impl.jdbcjobstore.JobStoreTX 
//表的前綴 
org.quartz.jobStore.tablePrefix : QRTZ_ 
//設置為TRUE不會出現序列化非字符串類到 BLOB 時產生的類版本問題 
//org.quartz.jobStore.useProperties : true 
//加入集群 true 為集群 false不是集群 
org.quartz.jobStore.isClustered : false 
//調度實例失效的檢查時間間隔 
org.quartz.jobStore.clusterCheckinInterval:20000 
//容許的最大作業延長時間 
org.quartz.jobStore.misfireThreshold :60000 
//ThreadPool 實現的類名 
org.quartz.threadPool.class:org.quartz.simpl.SimpleThreadPool 
//線程數量 
org.quartz.threadPool.threadCount : 10 
//線程優先級 
org.quartz.threadPool.threadPriority : 5(threadPriority 屬性的最大值是常量 java.lang.Thread.MAX_PRIORITY,等於10。最小值為常量 java.lang.Thread.MIN_PRIORITY,為1) 
//自創建父線程 
//org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true 
//數據庫別名 
org.quartz.jobStore.dataSource : qzDS 
//設置數據源 
org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver 
org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/quartz 
org.quartz.dataSource.qzDS.user:root 
org.quartz.dataSource.qzDS.password:123456 
org.quartz.dataSource.qzDS.maxConnection:10

7.JDBC插入表順序

主要的JDBC操作類,執行sql順序。 
Simple_trigger :插入順序 
qrtz_job_details —> qrtz_triggers —> qrtz_simple_triggers 
qrtz_fired_triggers 
Cron_Trigger:插入順序 
qrtz_job_details —> qrtz_triggers —> qrtz_cron_triggers 
qrtz_fired_triggers

 

 

8.參考文章

官網: http://www.quartz-scheduler.org/ 

深入解讀Quartz的原理 :http://lavasoft.blog.51cto.com/62575/181907/ 
基於 Quartz 開發企業級任務調度應用 :http://www.ibm.com/developerworks/cn/opensource/os-cn-quartz/ 
quartz 數據庫表含義解釋 :http://blog.csdn.net/tengdazhang770960436/article/details/51019291 
Quartz源碼分析: https://my.oschina.net/chengxiaoyuan/blog/664833 
http://blog.csdn.net/u010648555/article/category/6601767 
Quartz系列:http://blog.csdn.net/Evankaka/article/category/3155529


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM