使用Node.js的Node-cron進行任務排程 - Dilina

banq發表於2021-08-03

在使用 Node.js 構建 Web 應用程式和 API 時,我們有時會遇到需要重複執行的任務,例如電子郵件通知、檔案下載和資料庫備份等。 這可能是每天、每月甚至每年的特定時間,具體取決於在任務上。
Node-schedule是 Node.js 最流行的靈活的類似 cron 的任務排程庫。兩者很類似,是基於時間的時間表,而不是基於間隔的時間表和它被設計為在程式的排程。程式內排程意味著“排程作業只會在您的指令碼執行時觸發,並且在執行完成時排程將消失”。
如果您需要安排即使在您的指令碼未執行時也會持續存在的作業,請考慮使用實際的 Node-cron。

 

Node-cron 簡介
Node-cron是一個npm 包,它是用純 JavaScript為node編寫的,它基於GNU crontab語法。因此,第一步是基於學習node-cron和cron-syntaxes。

Node-cron 語法
cron 的操作由crontab(cron 表)檔案驅動,這是一個包含 cron 守護程式指令的配置檔案。Cron 守護程式是在記憶體中執行的系統管理可執行檔案,可用於排程任務。
 
以下作業計劃在每小時的每 2 分鐘執行一次。

import * as cron from 'node-cron'

cron.schedule('* 2 * * * *', () => {
  console.log('execute task every hour at the 2nd minute');
});


上述*的地方意味著“每一秒、每一小時、每一天、每一個月和一週中的每一天”。
下面的另一個例子顯示了每天早上 5.30 執行的 cron 作業,

cron.schedule('30 5 * * *', () => {
  console.log('execute task every day at 5:30 am');
});

如果我們想安排在一年中每個季度的第一天執行的作業,我們可以按如下方式進行。

cron.schedule('0 0 1 */3 *', () => {
  console.log('execute task every quater on the first day of the month');
});

在這裡你可以看到,我們使用了一個特殊的字元 (/),而不是通常的星號。就這樣,cron 作業排程中引入了一些特殊字元,我們可以將它們表示如下。
  • 逗號:逗號可用於分隔少數幾個值。例如,每 2 分鐘和 5 分鐘,我們可以將其表示為 2,5。
  • 連字元:連字元 (-) 用於提供值的範圍,例如 Monday-Friday。
  • 斜線:斜線用於提供步進值,例如每 5 秒,我們可以將其表示為 */5。

下面顯示了另一個示例,它可以安排作業在每週一到週五(僅限工作日)下午 4 點執行:

cron.schedule('0 16 * * 1-5', () => {
  console.log('running a task every weekday at 4:00 pm');
});

另一個例子顯示了在早上 5 點到早上 7 點之間每 15 分鐘執行一次的作業。

cron.schedule('*/15 5-7 * * *', () => {
  console.log('execute task every 15 minutes between 5 a.m. and 7 a.m.');
});

 

作業排程中使用的方法
啟動計劃:在初始化時,如果將 cron 選項設定為 False,那麼即使到達計劃時間,計劃作業也不會執行。如果您需要啟動該作業,則需要呼叫如下所示的start方法。

const cron = require('node-cron');

import * as cron from 'node-cron'
const job = cron.schedule('*/5 5-7 * * *', () => {
  console.log('execute task every 15 minutes between 5 a.m. and 7 a.m.');
});
job.start();

停止排程:如果您需要停止正在執行的任何排程,您應該使用stop方法。即使重新啟動,計劃也不會執行。

const cron = require('node-cron');

import * as cron from 'node-cron'
const job = cron.schedule('*/5 5-7 * * *', () => {
  console.log('execute task every 15 minutes between 5 a.m. and 7 a.m.');
});
job.stop();


銷燬時間表:您可以使用destroy方法永久銷燬時間表。

const cron = require('node-cron');

import * as cron from 'node-cron'
const job = cron.schedule('*/5 5-7 * * *', () => {
  console.log('execute task every 15 minutes between 5 a.m. and 7 a.m.');
});
job.destroy();


 


 

相關文章