一、
定時程式過去的做法
「傳統」的定時程式是我們去寫個
main
函式,配置指令碼,然後通過
crontab
的配置好特定的時間來執行。定時程式的監控可以通過記錄日誌來知道。
這樣的定時程式往往適用與每天定時去執行任務,比如報表之類的需求。
對於一些特別的需求,比如輪詢去掃瞄資料,根據資料的狀態來
update
資料的時候,執行緒的控制就顯得很重要了。
本片介紹開源框架
quartz。二、
關於quartz 1、
開放原始碼專案,專注於任務排程器。
2、提供了廣泛的特性:①持久化任務;②集群;③分布式
3、spring
支援對quartz
的整合;
核心由兩個介面和兩個類組成:
job和
scheduler
介面,jobdetail
和trigger
類。不同於
jdk timer
,任務不是從實現乙個
job介面的類例項開始執行,實際上
quartz
在需要的時候才建立
job類例項。可以使用
jobdetail
類來包裝任務狀態,並傳遞乙個資訊給
job,或在乙個
job的多次執行過程之間儲存資訊。
三、實現我們自己的任務排程器
我的需求中,需要每隔幾秒鐘啟動乙個執行緒來對新插入的資料進行修改。
對於這種任務
task
比較多,業務也相對複雜。
選擇quartz
,可以更方便的控制線程,融入
spring
,這樣的定時程式非常簡易。
spring
對quartz
整合與其對
jdk timer
排程整合類似,你可以在配置檔案中配置任務排程。僅需要在程式裡載入
,spring
會自動啟動排程器。
**:<?xml version="1.0" encoding="utf-8"?>
class="org.springframework.scheduling.quartz.methodinvokingjobdetailfactorybean">
excute
class="org.springframework.scheduling.quartz.crontriggerbean">每20
秒執行一次
-->
/20 * * * *?
autowire="no"
class="org.springframework.scheduling.quartz.schedule***ctorybean">
excutecrontrigger
" />
需要說明幾點: 1)
可以通過
spring
注入載入我們的任務類;
2)建立觸發器。可以選擇
******triggerbean
或crontriggerbean
類。******triggerbean
預設情況下把可重複執行次數設為無限,適合一些簡單的配置。
3)建立
schedule***ctory
。預設情況下,
schedule***ctorybean
建立乙個
stdschedule***ctory
的例項,後者建立
scheduler
的實現。可以通過設定
schedule***ctoryclass
屬性來覆蓋這個行為,需要繼承
schedule***ctory
介面來實現你自己的版本。
上面只是一些簡單的使用,同時,
quartz
可以設定打火策略,可以設定執行失敗後立即重新執行或者停止執行,對於一些特殊日期可以跳過;也有***,支援外掛程式功能。
更深入的使用我們可以做出來以下的實現
可以通過檢視任務的執行狀態;
可以暫停、恢復,移除任務;
可以動態排程任務。
這種功能將為我們統一定時程式,實現定時程式可控、易維護、易擴充套件給我們乙個更好的空間。
未完待續。
關於setInterval 定時
最近專案中,遇到個需求就是獲取停車場剩餘車位數量,想是通過ajax定時抓取介面資料來實現 本想通過signalr 但是專案本身直供少數人使用,感覺定時ajax可以滿足 下面上 var handle 定義標識,防止重複執行setinterval document ready function hand...
at,crontab定時程式
程式設計師對於定時執行任務一定不陌生,很多任務為了減少對使用者的干擾,如系統更新 維護 資料庫結構變更等,通常會選擇在凌晨進行。對於一些簡單的無需人工照看的任務,就可以預先寫好命令,並設定時間自動執行,然後就可以安心睡大覺了。其他情況還有,可以預計的將來要做的操作,為了防止遺忘,先寫好命令指令碼,然...
關於定時器
定時器是個很有意思的東西,它很有用,但我認為這不是現代計算機的結構所擅長的事情。計算機適合做那些很大量的簡單重複工作,或者根據請求做出回應。dos時代是沒有程序執行緒等概念的,那時候要想做到定時真是有些麻煩 通常的做法是死迴圈不斷監測時間,發現時間到了就做特定的事情 當然你可以用delay,來指定等...