Quartz體系結構

任務調度場景的核心分爲以時間爲關注點的調度和資源上的調度。

以時間爲關注點的調度如:微博禁言一週、凍結用戶賬號,在一週之內不能登錄等

資源上的調度如:每執行一個任務都要開一個線程,無限制的使用必然耗盡虧空,大多數系統都要對資源使用進行控制——首先服務線程的最大數目必須限制,其次可以考慮使用線程池以便共享服務的線程資源,降低頻繁創建、銷燬線程的消耗。

任務調度本身涉及到多線程併發、運行時間規則制定及解析、運行現場保持與恢復、線程池維護等諸多方面的工作。

Quartz的核心主要包括三部分:任務(Job)、觸發器(Trigger)和調度器(Scheduler),其中Scheduler是整個系統框架的心臟和靈魂。

1、任務Job

job是一個接口,只有一個方法void execute(JobExecutionContext context),開發者實現該接口定義運行任務

   JobExecutionContext類提供了調度上下文的各種信息,如獲取執行中的JobDetail實例和執行完成後的Trigger對象。當Scheduler決定什麼時候執行Job的時候,他會傳JobExecutionContext給Job;JobExecutionContext包含了Quartz的運行環境和Job本身的明細數據,相當於ServletContext一樣。

   JobDetail描述一個給定Job實例的詳細信息。JobDetails是通過JobBuilder來創建和定義的。Quartz在每次執行Job時,都重新創建一個Job實例,所以它不直接接收實現Job接口的實例,相反,它接收一個實現Job接口的一個實現類,以便運行時通過newInstace()的反射機制實例化Job。因此需要一個類來描述Job的實現類及其他的相關信息,如Job類名、方法、描述、Key值、關聯監聽器等信息,JobDetail承擔了這一角色。

   Job運行時的信息保存在JobDataMap實例中。當需要向Job傳值的時候就可以通過JobDataMap傳入。

Job狀態

   有狀態的Job(StateFulJob):

在每次執行完Job後JobDataMap中的值就會存儲到JobStore中去,所以在下次執行這個Job的時候,JobDataMap中的數據依然存在。可以通過Map中的put()去改變它的值

   無狀態的Job(Job):

任何時候執行完Job,JobDataMap中的數據都不會被持久化,所以每次創建Job的時候都要對JobDataMap進行數據的添加。

   兩者區別

兩個或者多個有狀態的JobDetail實例都不能併發執行,如果一個有狀態的JobDetail再創建兩個Trigger來觸發這個Job,一個每5分鐘觸發,另一個也是每5分鐘觸發,兩個Tigger試圖在同一時間去觸發這個Job,框架是不允許這個的事情發生,第二個會一直被阻塞到第一個執行結束,這是基於安全的考慮

2、觸發器Trigger

描述觸發Job執行的觸發時間規則。主要有SimpleTrigger和CronTrigger兩個子類。當僅需觸發一次或者以固定時間間隔週期執行,SimpleTrigger是最適合的選擇;而CronTrigger則可以通過Cron表達式定義出各種複雜時間規則的調度方案:如週一、週三、週五下午5:00執行。

3、調度器(scheduler)

代表一個Quartz的獨立運行容器,Trigger和JobDetails可以註冊到Scheduler中,兩者在Scheduler中擁有各自的組及名稱,組及名稱是Scheduler查找定位容器中某一對象的依據,Trigger的組及名稱必須唯一,JobDetail的組和名稱也必須唯一(但可以和Trigger的組和名稱相同,因爲它們是不同類型的)。Scheduler定義了多個接口方法,允許外部通過組及名稱訪問和控制容器中Trigger和JobDetail。

Scheduler可以將Trigger綁定到某一JobDetail中,這樣當Trigger觸發時,對應的Job就被執行。一個Job可以對應多個Trigger,但一個Trigger只能對應一個Job。可以通過SchedulerFactory創建一個Scheduler實例。

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