摘要:類是一個(gè)抽象類,由安排為一次執(zhí)行或重復(fù)執(zhí)行的任務(wù)。也是自帶的一個(gè)基于線程池設(shè)計(jì)的定時(shí)任務(wù)類。問題,則可以直接使用類實(shí)現(xiàn)自定義的定時(shí)調(diào)度規(guī)則。
定時(shí)調(diào)度
作為后端開發(fā)人員,我們總會(huì)遇到這樣的業(yè)務(wù)場景:每周同步一批數(shù)據(jù);每半個(gè)小時(shí)檢查一遍服務(wù)器運(yùn)行狀況;每天早上八點(diǎn)給用戶發(fā)送一份包含今日待辦事項(xiàng)的郵件,等等。
這些場景中都離不開“定時(shí)器”,就像一個(gè)定好時(shí)間規(guī)則的鬧鐘,它會(huì)在指定時(shí)間觸發(fā),執(zhí)行我們想要定義的調(diào)度任務(wù)。那么我們今天就來數(shù)一下,那些年我們用過的“定時(shí)調(diào)度”。
1.job (oracle)
從剛工作就一直使用oracle數(shù)據(jù)庫,最早接觸的定時(shí)任務(wù)就是oracle數(shù)據(jù)庫的job。job有定時(shí)執(zhí)行的功能,可以在指定的時(shí)間點(diǎn)或每天的某個(gè)時(shí)間點(diǎn)自行執(zhí)行任務(wù)。 而且oracle重新啟動(dòng)后,job會(huì)繼續(xù)運(yùn)行,不用重新啟動(dòng)。
而且job的機(jī)制非常完備,可以查詢相關(guān)的表或視圖,查詢job的定時(shí)規(guī)則和執(zhí)行情況。缺點(diǎn)是作為oracle數(shù)據(jù)庫層面的工具,自定義功能擴(kuò)展,二次開發(fā)的難度比較大。
1.1 創(chuàng)建job
1.2 刪除job
1.3 查詢job
2.crontab (linux)
crond 是linux下用來周期性的執(zhí)行某種任務(wù)或等待處理某些事件的一個(gè)守護(hù)進(jìn)程,與windows下的計(jì)劃任務(wù)類似,當(dāng)安裝完成操作系統(tǒng)后,默認(rèn)會(huì)安裝此服務(wù) 工具,并且會(huì)自動(dòng)啟動(dòng)crond進(jìn)程,crond進(jìn)程每分鐘會(huì)定期檢查是否有要執(zhí)行的任務(wù),如果有要執(zhí)行的任務(wù),則自動(dòng)執(zhí)行該任務(wù)。
cron是服務(wù)名稱,crond是后臺(tái)進(jìn)程,crontab則是定制好的計(jì)劃任務(wù)表。大部分linux系統(tǒng)默認(rèn)都安裝了cron,可以檢查一下。
crontab基本操作命令
crontab表達(dá)式格式
3.Timer和ScheduledExecutorService (java)
Timer是jdk中提供的一個(gè)定時(shí)器工具,使用的時(shí)候會(huì)在主線程之外起一個(gè)多帶帶的線程執(zhí)行指定的計(jì)劃任務(wù),可以指定執(zhí)行一次或者反復(fù)執(zhí)行多次。
TimerTask是一個(gè)實(shí)現(xiàn)了Runnable接口的抽象類,代表一個(gè)可以被Timer執(zhí)行的任務(wù)。
TimerTask類是一個(gè)抽象類,由Timer 安排為一次執(zhí)行或重復(fù)執(zhí)行的任務(wù)。它有一個(gè)抽象方法run()方法,該方法用于執(zhí)行相應(yīng)計(jì)時(shí)器任務(wù)要執(zhí)行的操作。因此每一個(gè)具體的任務(wù)類都必須繼承TimerTask,然后重寫run()方法。 另外它還有兩個(gè)非抽象的方法
當(dāng)然,一般使用Timer的比較少,因?yàn)樗娜秉c(diǎn)比較明顯:
1.單線程,當(dāng)多個(gè)timer同時(shí)運(yùn)行時(shí),會(huì)等上一個(gè)執(zhí)行完成,再執(zhí)行下一個(gè)。
2.Timer線程是不會(huì)捕獲異常的,如果TimerTask拋出的了未檢查異常則會(huì)導(dǎo)致Timer線程終止。
所以一般使用ScheduledExecutorService替代Timer。 ScheduledExecutorService:也是jdk自帶的一個(gè)基于線程池設(shè)計(jì)的定時(shí)任務(wù)類。其每個(gè)調(diào)度任務(wù)都會(huì)分配到線程池中的一個(gè)線程執(zhí)行,所以其任務(wù)是并發(fā)執(zhí)行的,互不影響。
4.SpringTask (spring)
Timer和ScheduledExecutorService都是屬于jdk層面上實(shí)現(xiàn)定時(shí)調(diào)度的類,功能還不足以讓我們滿意,那么現(xiàn)在介紹一個(gè)比較完善的定時(shí)調(diào)度工具 - SpringTask,是Spring提供的,支持注解和配置文件形式,支持crontab表達(dá)式,使用簡單但功能強(qiáng)大。我個(gè)人非常喜歡SpringTask,僅僅是因?yàn)橹С謈rontab表達(dá)式。
在springboot里面使用方式非常簡單:
1.啟動(dòng)類添加開啟定時(shí)調(diào)度的注解 @EnableScheduling
2.在需要定時(shí)執(zhí)行的方法上,增加注解 @Scheduled(cron ="crontab表達(dá)式")
默認(rèn)的簡單的使用步驟只有以上兩步,但是SpringTask的默認(rèn)使用方式也有一些不足:
1.默認(rèn)線程池的poolsize為1,可以理解為Timer類似的單線程模式。
無法動(dòng)態(tài)修改crontab表達(dá)式,修改完只能重新部署后,才能生效。
問題1的解決方式,可以通過自定義 TaskExecutor來修改當(dāng)前的線程池。問題2,則可以直接使用 threadPoolTaskScheduler類實(shí)現(xiàn)自定義的定時(shí)調(diào)度規(guī)則。
附解決兩個(gè)問題的源碼 TaskTimer.class
5.Quartz (其他產(chǎn)品)
Quartz是一個(gè)完全由 Java 編寫的開源作業(yè)調(diào)度框架,為在 Java 應(yīng)用程序中進(jìn)行作業(yè)調(diào)度提供了簡單卻強(qiáng)大的機(jī)制。它是一個(gè)功能強(qiáng)大、十分成熟的重量級(jí)產(chǎn)品,還支持負(fù)載均衡,實(shí)現(xiàn)分布式調(diào)度。
不過,對(duì)于Quartz的安裝你要多花點(diǎn)功夫了,從數(shù)據(jù)庫要建哪些表,到應(yīng)用程序該如何部署。對(duì)于這樣一個(gè)龐大的產(chǎn)品,本篇文章就不附上它的使用說明書了。
本人創(chuàng)業(yè)團(tuán)隊(duì)產(chǎn)品MadPecker,主要做BUG管理、測試管理、應(yīng)用分發(fā),網(wǎng)址:www.madpecker.com,有需要的朋友歡迎試用、體驗(yàn)!
本文為MadPecker團(tuán)隊(duì)技術(shù)人員編寫,轉(zhuǎn)載請(qǐng)標(biāo)明出處
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77793.html
摘要:也是自帶的一個(gè)基于線程池設(shè)計(jì)的定時(shí)任務(wù)類。問題的解決方式,可以通過自定義來修改當(dāng)前的線程池。問題,則可以直接使用類實(shí)現(xiàn)自定義的定時(shí)調(diào)度規(guī)則。 定時(shí)調(diào)度 作為后端開發(fā)人員,我們總會(huì)遇到這樣的業(yè)務(wù)場景:每周同步一批數(shù)據(jù);每半個(gè)小時(shí)檢查一遍服務(wù)器運(yùn)行狀況;每天早上八點(diǎn)給用戶發(fā)送一份包含今日待辦事項(xiàng)的郵件,等等。 這些場景中都離不開定時(shí)器,就像一個(gè)定好時(shí)間規(guī)則的鬧鐘,它會(huì)在指定時(shí)間觸發(fā),執(zhí)行我...
摘要:時(shí)間永遠(yuǎn)都過得那么快,一晃從年注冊,到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
閱讀 1777·2021-10-11 10:57
閱讀 2370·2021-10-08 10:14
閱讀 3407·2019-08-29 17:26
閱讀 3369·2019-08-28 17:54
閱讀 3036·2019-08-26 13:38
閱讀 2915·2019-08-26 12:19
閱讀 3622·2019-08-23 18:05
閱讀 1290·2019-08-23 17:04