筆者的其他文章推薦: 《JS 函數(shù)式編程思維簡述》
前言
? ? ? ?就像上一章舉得例子,有的時候我們希望應(yīng)用能夠每隔一段時間育瓜,自動做一些操作葫隙。比如,自動獲取了第三方的數(shù)據(jù)更新爆雹,用于調(diào)整自己的業(yè)務(wù)停蕉;再比如一些更新頻率低但查詢頻率高的數(shù)據(jù),我們可以將數(shù)據(jù)查詢到內(nèi)存中钙态,并設(shè)置每隔多久檢查一次是否需要更新內(nèi)存中緩存好的數(shù)據(jù)。這些操作都需要使用到定時任務(wù)菇晃;
編寫一個定時任務(wù)
? ? ? ?Egg 約定了定時任務(wù)文件統(tǒng)一存放于 app/schedule/
位置册倒,在 Egg 項目加載的過程中,會自動解析該目錄下的文件磺送,并以文件返回的對象來控制如何執(zhí)行定時任務(wù):
const Subscription = require('egg').Subscription;
class UpdateCache extends Subscription {
// 通過 schedule 屬性來設(shè)置定時任務(wù)的執(zhí)行間隔等配置
static get schedule() {
return {
// interval: '1m', // 1 分鐘間隔
cron: '*/15 * * * * *', // 也可以通過 cron 表達(dá)式來構(gòu)建時間間隔
type: 'all', // 指定所有的 worker 都需要執(zhí)行
};
}
// subscribe 是真正定時任務(wù)執(zhí)行時被運行的函數(shù)
async subscribe() {
const res = await this.ctx.curl('http://www.api.com/cache', {
dataType: 'json',
});
this.ctx.app.cache = res.data;
}
}
export default UpdateCache;
屬性解析
? ? ? ?subscribe()
函數(shù)表示在定時任務(wù)執(zhí)行時驻子,真正執(zhí)行的代碼段。而屬性 schedule
則相當(dāng)于是為當(dāng)前的定時器指定的配置:
屬性 | 類型 | 描述 |
---|---|---|
interval | number | 定時任務(wù)每隔 n 毫秒執(zhí)行一次 |
- | string | 定時任務(wù)每隔 n 毫秒執(zhí)行一次 (會將 ms 方式轉(zhuǎn)換成毫秒,如 5m 代表 5分鐘 ) |
cron | string | 以 cron 表達(dá)式 來指定定時時機估灿,如 0 0 */3 * * * 代表每隔3小時執(zhí)行一次 |
cronOptions | object | 配置 cron 的時區(qū)等崇呵,參見 cron-parser 文檔 |
type | string |
all:代表每一個worker都會執(zhí)行 worker:代表會隨機選一個worker來執(zhí)行此次定時任務(wù) |
immediate | boolean | 配置了該參數(shù)為 true 時,這個定時任務(wù)會在應(yīng)用啟動并 ready 后立刻執(zhí)行一次這個定時任務(wù)馅袁。 |
disable | boolean | 配置該參數(shù)為 true 時域慷,這個定時任務(wù)不會被啟動。 |
env | Array | 數(shù)組汗销,僅在指定的環(huán)境下才啟動該定時任務(wù)犹褒。 |
項目結(jié)構(gòu)
// 這是一個 egg 項目的目錄結(jié)構(gòu)
├─ app
│ ├─ controller
│ │ ├─ pokemon.ts
│ │ └─ home.ts
│ ├─ service
│ │ ├─ pokemon.ts
│ │ └─ home.ts
│ ├─ model
│ │ ├─ pokemon.ts
│ │ └─ user.ts
│ ├─ middleware
│ │ └─ xtoken.ts
│ ├─ schedule
│ │ └─ somerefresh.ts
│ └─ router.ts
├─ config
│ ├─ config.default.ts
│ ├─ config.prod.ts
│ ├─ config.local.ts
│ └─ plugin.ts
├─ agent.ts
├─ app.ts
│