什么是quartz?
quartz是一個開源的任務調度框架,它可以幫助我們實現任務的定時調度,任務的持久化,支持故障切換和負載均衡。當然,它的優點遠遠不止這些。
什么是任務調度框架?
任務調度框架的核心功能就是它可以根據我們定義好的調度規則,在線程池中創建線程來執行我們的業務方法。那么一個完善的任務調度框架需要具備哪些功能呢?
靈活的觸發規則
觸發規則就是我的這個業務方法需要在什么時候開始執行,每隔多少時間執行,一共需要執行多少次。對於觸發規則來說我們常見的是使用corn表達式,來進行任務觸發規則的表達。
任務的持久化
任務的持久化就是彌補內存中保存任務的不足。比如說程序異常退出,那么此時我們就無法知道上一次執行的狀態,只能夠重新開始執行。舉個例子,比如說我們的某個任務需要在9點執行,當前時間為8.59分,程序剛好異常退出。重新啟動完成的時候已經到了9點01分,那么此時我們是無法知道9點是否執行了那個任務的。
彌補措施
上面說到了,如果程序異常退出,那么此時我們應該基於什么樣的策略進行彌補?是直接忽略,還是立馬執行?quartz的彌補策略比較豐富,博主會在之后的文章中詳細介紹。除了異常退出會導致失火之外,任務的耗時執行,也會導致失火。比如說你的任務每隔3秒執行依次,你的任務執行一次需要5秒,那么你的任務還沒執行完的時候,第二個觸發調度就開始了,那么此時又應該怎么處理呢?
負載均衡
為了解決單點故障的問題,我們可以多部署幾個服務。但是怎么確保這些服務可以平均分分配到對應的服務器上,這里就需要使用負載均衡策略,比如說隨機分配,加權輪詢等。
任務的監控
作為使用者來說,我們當然希望知道此時程序任務的執行狀態。而通過日志,數據庫表查詢狀態的方式並不直接,也比較費時費力,也不通用。那么此時,我們就需要提供一個監控界面,來實時查看任務的總體情況,以及某一個任務的執行歷史,當然我們也可以手動決定某個任務是否執行,這樣我們就不需要修改代碼重新發布了。
quartz使用
說了這么多關於任務調度框架的東西,我們先來介紹一下quartz的簡單使用。至於源碼,以及更詳細的quartz使用,博主會在后面的文章中繼續介紹。
導入依賴
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
編寫job
我們先實現一個job,然后在execute方法里面,放入我們的業務邏輯。
public class TestJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("hello world!");
}
}
調度job
有了任務之后,我們需要對任務進行調度。
public class Main {
public static void main(String[] args) throws SchedulerException {
//創建一個任務詳情對象,它里面有我們業務job的class對象
JobDetail jobDetail = JobBuilder.newJob(TestJob.class).withIdentity("myJob").build();
//創建一個簡單的觸發器,它的觸發規則是基於當前時間,每個1秒執行,並且只執行一次。
SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).withRepeatCount(1)).build();
//創建調度器,它會根據觸發規則,將任務放到線程中執行。
StdSchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail,trigger);
}
}
查看運行結果
博主微信公眾號
