springboot整合了@scheduled的相關依賴(org.springframework.scheduling.annotation.scheduled);我們只需要直接使用即可。
注意:spring的定時任務預設是單執行緒的。如果有多個定時任務,那麼執行起來時間會有問題;這時就需要
開啟多執行緒了(先把基本知識介紹完,本文末尾再介紹執行緒問題)。
注:如果只有乙個定時任務,那麼我們可以將這個定時任務單獨拿出來作為乙個微服務;這樣一來就不需要開
啟多執行緒了。
cronexpression定義時間規則,cron表示式由6或7個空格分隔的時間字段組成: 秒分時
日月星期年(可選);
注:如果spring中使用的是q
uartz等的話,那麼cron表示式是支援七位的;如果spring中使用的是spring task等的話,
那麼cron表示式只支援六位。
字段允許值
允許的特殊字元
秒0-59
分0-59
時0-23
日1-31
, - * ? / l w c
月1-12 或 jan-dec
星期1-7 或 sun-sat
注:1是星期天,7是星期六
, - * ? / l c #
年1970-2099
特殊字元:
示例:
"0 0 10,14,16 * * ?"
每天上午10點,下午2點,4點
"0 0/30 9-17 * * ?"
朝九晚五工作時間內每半小時
"0 0 12 ? * wed"
表示每個星期三中午12點
"0 0 12 * * ?"
每天中午12點觸發
"0 15 10 ? * *"
每天上午10:15觸發
"0 15 10 * * ?"
每天上午10:15觸發
"0 15 10 * * ? *"
每天上午10:15觸發
"0 15 10 * * ? 2005"
2023年的每天上午10:15觸發
"0 * 14 * * ?"
在每天下午2點到下午2:59期間的每1分鐘觸發
"0 0/5 14 * * ?"
在每天下午2點到下午2:55期間的每5分鐘觸發
"0 0/5 14,18 * * ?"
在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發
"0 0-5 14 * * ?"
在每天下午2點到下午2:05期間的每1分鐘觸發
"0 10,44 14 ? 3 wed"
每年三月的星期三的下午2:10和2:44觸發
"0 15 10 ? * mon-fri"
周一至周五的上午10:15觸發
"0 15 10 15 * ?"
每月15日上午10:15觸發
"0 15 10 l * ?"
每月最後一日的上午10:15觸發
"0 15 10 ? * 6l"
每月的最後乙個星期五上午10:15觸發
"0 15 10 ? * 6l 2002-2005"
2023年至2023年的每月的最後乙個星期五上午10:15觸發
"0 15 10 ? * 6#3"
每月的第三個星期五上午10:15觸發
在同乙個執行緒中,如果執行某乙個定時任務所需時間較長,那麼就可能影響其他所需時間較短的定時任務。即:當所需時間較長的方法搶占到了執行緒;在其還沒有執行完時,其他的定時任務錯過了「定時」。如:
控制台列印出的結果為:
配置執行緒池(springboot配置執行緒池無需引入其他依賴,直接使用註解即可):
在有@scheduled定時計畫的方法上,使用執行緒池:
此時,控制台列印出的資訊為:
如上圖所示:方法two每5秒執行一次;方法one每10秒執行一次(截圖我只截了一點,下面的也遵循這個規律)
由此可見:開啟多執行緒使用執行緒池後,解決了之前的問題。
spring 定時計畫
定時表示式 cronexpresession的設定格式,附下 字段 允許值 允許的特殊字元 秒 0 59 分 0 59 小時 0 23 日期 1 31 l w c 月份 1 12 或者 jan dec 星期 1 7 或者 sun sat l c 年 可選 留空,1970 2099 表示式 意義 0 ...
MySQL定時計畫任務
5.1版本以後,mysql支援定時執行 event 的功能,就跟linux的crontab差不多。一 先檢視一下你的msyql版本,查詢版本資訊的sql語句 sql select version 確定版本支援之後,再檢視一下event是否開啟 二 檢視是否開啟event 1 mysql event功...
ansible windows 定時計畫任務
ansible使用win shell模組執行windows命令。ansible all m win shell a schtasks create sc daily tn restart tr c windows system32 shutdown.exe r f t 1 st 02 00 建立定時...