很多時候我們的項目需要一個定時任務, 讓程序定時去做一些事情, egg.js框架為我們提供了一套機制來讓定時任務的編寫和維護更加優(yōu)雅, 下面我們就寫一個小例子來看看egg.js怎么實現(xiàn)一個定時任務功能
##### 編寫一個定時任務
在egg.js中, 所有的定時任務都統(tǒng)一放在app/schedule目錄下, 在這個目錄下創(chuàng)建的每個文件都是一個定時任務, 說白了就是你只要在這里創(chuàng)建一個文件, egg.js框架就會把它當做一個定時任務去執(zhí)行
創(chuàng)建/app/schedule/log.js
```
module.exports = {
? schedule: {
? ? interval: '10s', // 任務的間隔時間, 這個定義的10秒執(zhí)行一次
? ? type: 'all', // 指定所有的 worker都需要執(zhí)行
? },
? async task(ctx) {
? ? // 這里編寫我們要執(zhí)行的任務代碼, 我們這里就打印一下當前時間的試試
? ? console.log("任務執(zhí)行 : "+ new Date().toString());
? },
};
```
就這就可以了粪牲? 對, 就這就可以了, 就是這么簡單
運行項目, 這個時候每隔10秒鐘就會打印一條日志
```
任務執(zhí)行 : Sat Aug 03 2019 10:31:52 GMT+0800 (GMT+08:00)
任務執(zhí)行 : Sat Aug 03 2019 10:32:02 GMT+0800 (GMT+08:00)
任務執(zhí)行 : Sat Aug 03 2019 10:32:12 GMT+0800 (GMT+08:00)
```
##### 定時任務的方式
定時任務的方式有兩種, 分別是interval和cron, 上面我們的例子使用的是interval的定時方式
- interval
這種定時方式定時任務會間隔指定時間去執(zhí)行一次
interval的值有兩種類型, 一種是數(shù)字類型, 單位是毫秒, 比如1000, 就代表每隔1000毫秒執(zhí)行一次定時任務, 另外一種是字符類型, 例如'5s'就代表每隔5秒, '3m'就代表每隔3分鐘執(zhí)行一次定時任務
- cron
定時任務會按照cron表達式在特定時間點執(zhí)行
```
*? ? *? ? *? ? *? ? *? ? *
┬? ? ┬? ? ┬? ? ┬? ? ┬? ? ┬
│? ? │? ? │? ? │? ? │? ? |
│? ? │? ? │? ? │? ? │? ? └ day of week (0 - 7) (0 or 7 is Sun)
│? ? │? ? │? ? │? ? └───── month (1 - 12)
│? ? │? ? │? ? └────────── day of month (1 - 31)
│? ? │? ? └─────────────── hour (0 - 23)
│? ? └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, optional)
```
cron: '0 0 */3 * * *', 意思就是每隔3個小時執(zhí)行一次
##### 類型
框架提供的定時任務默認支持兩種類型,worker 和 all
worker類型:每臺機器上只有一個worker 會執(zhí)行這個定時任務止剖,每次執(zhí)行定時任務的 worker 的選擇是隨機的
all類型:每臺機器上的每個worker 都會執(zhí)行這個定時任務
#### 執(zhí)行日志
執(zhí)行日志會輸出到 ${appInfo.root}/logs/{app_name}/egg-schedule.log腺阳,默認不會輸出到控制臺