node schedule實現(xiàn)定時任務的示例代碼
一、定時任務
實際工作中,可能會遇到定時清除某個文件夾內(nèi)容,定時發(fā)送消息或發(fā)送郵件給指定用戶,定時導出某些數(shù)據(jù)等。借助setTimeout和setInterval來實現(xiàn)的化太過麻煩,node-schedule是一個非常不錯的npm包,可以幫助我們快速的創(chuàng)建和管理定時任務。
定時任務是指在預定的時間點或時間間隔內(nèi)執(zhí)行的任務或操作。它們是自動化執(zhí)行特定邏輯的一種方式,可用于執(zhí)行重復性的、周期性的或計劃性的任務。
定時任務通常用于以下情況:
數(shù)據(jù)管理與備份:定時任務可以用于定期備份數(shù)據(jù)庫中的數(shù)據(jù),確保數(shù)據(jù)的安全性和可靠性。此外,還可以用于多個數(shù)據(jù)源之間的數(shù)據(jù)同步,保證數(shù)據(jù)的一致性。
系統(tǒng)監(jiān)控與維護:定時任務可以用于監(jiān)控系統(tǒng)中的各種指標和狀態(tài),如服務器負載、數(shù)據(jù)庫連接池的使用情況等,及時發(fā)現(xiàn)并解決潛在的問題。同時,也可以用于定期刷新緩存,保證緩存數(shù)據(jù)的及時性和準確性。
執(zhí)行定時任務:定時器可以用于在預定的時間間隔內(nèi)執(zhí)行特定的任務或代碼塊,例如數(shù)據(jù)備份、日志清理、緩存刷新等操作。
定時提醒和通知:定時器可以用于實現(xiàn)定時提醒和通知功能,如鬧鐘、定時器應用等,通過設(shè)置定時器,在指定的時間點觸發(fā)提醒或通知,幫助用戶記住重要事件或完成特定任務。
自動保存和自動提交:定時器可以用于自動保存或自動提交表單數(shù)據(jù),通過設(shè)置定時器,在一定的時間間隔內(nèi)自動將用戶輸入的數(shù)據(jù)保存到服務器或數(shù)據(jù)庫,避免數(shù)據(jù)丟失或用戶忘記保存的情況。
定時刷新頁面內(nèi)容:定時器可以用于定時刷新頁面的特定部分或整個頁面,通過設(shè)置定時器,在一定的時間間隔內(nèi)更新頁面內(nèi)容,如實時展示新聞、股票行情等。
會話管理與心跳檢測:在Web應用中,定時器可以用來檢查并清理長時間未活動的用戶會話,以及客戶端和服務端之間利用定時器發(fā)送心跳包來維持長連接,及時發(fā)現(xiàn)連接異常。
延遲執(zhí)行與調(diào)度任務:定時器可以用于延遲發(fā)送消息或在非高峰時段執(zhí)行批處理作業(yè),減輕服務器負載。
二、node-schedule
1、安裝
npm install node-schedule
2、引入
CommonJS:
const schedule = require('node-schedule');
ES模塊
import schedule from 'node-schedule'
3、基于Cron表達式的規(guī)則
Cron表達式是一種用于指定定時任務執(zhí)行時間的字符串表示形式。它由6個字段組成,每個字段表示任務執(zhí)行的時間單位和范圍。
* * * * * * ┬ ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ │ │ │ │ │ │ └ 星期幾(0 - 7) (0相對于周日) │ │ │ │ └───── 月 (1 - 12) │ │ │ └────────── 日 (1 - 31) │ │ └─────────────── 時 (0 - 23) │ └──────────────────── 分 (0 - 59) └───────────────────────── 秒 (0 - 59)
每個字段可以接受特定的數(shù)值、范圍、通配符和特殊字符來指定任務的執(zhí)行時間:
- 數(shù)值:表示具體的時間單位,如1、2、10等。
- 范圍:使用-連接起始和結(jié)束的數(shù)值,表示一個范圍內(nèi)的所有值,如1-5表示1到5的所有數(shù)值。
- 通配符:使用表示匹配該字段的所有可能值,如表示每分鐘、每小時、每天等。
- 逗號分隔:使用逗號分隔多個數(shù)值或范圍,表示匹配其中任意一個值,如1,3表示1或3。
- 步長:使用/表示步長,用于指定間隔的數(shù)值,如*/5表示每隔5個單位執(zhí)行一次。
- 特殊字符:Cron表達式還支持一些特殊字符來表示特定的含義,如?用于替代日和星期字段中的任意值,L表示最后一天,W表示最近的工作日等。
使用cron字符串作為rule時,建議寫完整,可讀性比較好。
以下是一些常見的Cron表達式示例:
* * * * * * :每秒執(zhí)行 */5 * * * * * :每5秒執(zhí)行 * 30 * * * * :每30分鐘執(zhí)行 */10 30 * * * * :每30分鐘的10秒執(zhí)行 2,4,6 * * * * * :每個2秒,4秒和6秒執(zhí)行 0 0 0 ? * 1 :每周一早上的零點執(zhí)行 * * * 20 * ? :每月的20日觸發(fā)
4、基于Date的規(guī)則
當你需要在具體的時間執(zhí)行一次,可以使用new Date來定義一個時間。
假設(shè)您非常希望在一個精確到某一個時間點上的秒數(shù)的僅觸發(fā)一次的計劃。
const schedule = require('node-schedule'); //2024年,6月,1日,6時,1分,0秒 //month 范圍是 0~11 而非1~12 const date = new Date(2024, 5, 1, 6, 1, 0); const job = schedule.scheduleJob(date, ()=>{ console.log('Happy Children's Day !'); });
5、基于RecurrenceRule的規(guī)則
如果你的任務是定時重復執(zhí)行的,并且你希望有比cron更高的可讀性,你可以嘗試使用RecurrenceRule對象作為rule。
function Recurrence(year, month, date, dayOfWeek, hour, minute, second, tz)
dayOfWeek 范圍是 0~6
month 范圍是 0~11 而非1~12
如果是連續(xù)的值,node-schedule提供了一個Range函數(shù)用于創(chuàng)建連續(xù)的元素
- 每分鐘的15、30、45秒執(zhí)行
const rule = new schedule.RecurrenceRule(); //每個15、30、45秒執(zhí)行 rule.second = [15, 30, 45]; const job = schedule.scheduleJob(rule, () => { console.log(`每次計劃執(zhí)行的時間:${new Date().toLocaleString()}`); });
- 每分鐘的第10秒
rule.second = 10;
- 每小時的第10分鐘
rule.minute = 10;
- 每周四,周五,周六,周天的17點
rule.dayOfWeek = [0, new schedule.Range(4, 6)]; rule.hour = 17; rule.minute = 0;
6、API
- 開啟定時任務
需要用到scheduleJob函數(shù),會返回一個Job實例對象:
function scheduleJob(name: string, rule: ..., callback: function): schedule.Job
參數(shù)
參數(shù)名 | 參數(shù)類型 | 參數(shù)描述 |
---|---|---|
name | 任務名,當你沒有指定時,它將以時間戳作為名字。 | |
rule | 任務調(diào)度的規(guī)則,支持多種形式的rule: string - Cron表達式 number schedule.RecurrenceRule Date | |
callback | 創(chuàng)建任務時的回調(diào)函數(shù) |
可以通過scheduleJob(name, rule, callback)或者scheduleJob(rule, callback)創(chuàng)建計劃。
const rule = '* * * * * *'; const job = schedule.scheduleJob(rule,()=>{});
- 取消定時任務
schedule.cancelJob(id)
7、狀態(tài)監(jiān)聽
import schedule from 'node-schedule'; //設(shè)置規(guī)則 const rule = "*/10 * * * * *" //設(shè)置任務 const job = schedule.scheduleJob(rule, () => { console.log('2、每次計劃執(zhí)行中的事件。'); }); job.on("scheduled", () => { console.log("1、每次計劃執(zhí)行前的事件。"); }); job.on("run", () => { console.log("3、每次計劃執(zhí)行后的事件。"); }); job.on("success", () => { console.log(`4、每次計劃執(zhí)行成功事件。`); }); job.on("error", (err) => { console.log(`[error][${new Date().toLocaleString()}]${err.message}`); }); job.on("canceled", () => { console.log("計劃取消!"); })
到此這篇關(guān)于node schedule實現(xiàn)定時任務的示例代碼的文章就介紹到這了,更多相關(guān)node schedule 定時任務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
node的EventEmitter模塊基本用法簡單實現(xiàn)示例
這篇文章主要為大家介紹了node的EventEmitter模塊基本用法簡單實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09Nodejs中使用puppeteer控制瀏覽器中視頻播放功能
本項目主要功能為在瀏覽器中自動播放視頻,并且實現(xiàn)音量控制,快進快退,全屏控制,播放暫??刂频裙δ?。對Nodejs中使用puppeteer控制瀏覽器中視頻播放功能感興趣的朋友跟隨小編一起看看吧2019-08-08Node.js 中的流Stream模塊簡介及如何使用流進行數(shù)據(jù)處理
Node.js中的流(Stream)模塊用于高效處理流式數(shù)據(jù),包括可讀流、可寫流、雙邊流和轉(zhuǎn)換流等,通過`fs.createReadStream`和`.pipe`方法可以方便地讀取文件并寫入控制臺或處理網(wǎng)絡請求,在實際開發(fā)中,需要注意錯誤處理、資源管理和性能優(yōu)化等問題2025-03-03從零學習node.js之mysql數(shù)據(jù)庫的操作(五)
因為接觸Node.JS已經(jīng)有一段時間了,最近粗略的研究了一下node.js操作數(shù)據(jù)庫的包,覺得node.js連接數(shù)據(jù)庫不錯。下面這篇文章主要給大家介紹了node.js之mysql數(shù)據(jù)庫操作的相關(guān)資料,需要的朋友可以參考下。2017-02-02干凈卸載Windows的Node.js環(huán)境的方法
這篇文章主要介紹了如何干凈卸載Windows的Node.js環(huán)境的方法,文中通過圖文結(jié)合的方式講解的非常詳細,對大家刪除Node.js環(huán)境有一定的幫助,需要的朋友可以參考下2025-01-01Nodejs進階:如何將圖片轉(zhuǎn)成datauri嵌入到網(wǎng)頁中去實例
這篇文章主要介紹了Nodejs進階:如何將圖片轉(zhuǎn)成datauri嵌入到網(wǎng)頁中去,有興趣的可以了解一下。2016-11-11