JS相关

Egg 框架简述 (六):定时任务

2018-12-15  本文已影响23人  阿拉拉布
  1. 简述
  2. 简单层级关系
  3. 路由(Router)
  4. 内置对象
  5. 配置(Config)
  6. 中间件(MiddleWare)
  7. 插件(Plugins)
  8. 常用对象关系模型(egg-sequelize)
  9. Worker和Agent
  10. 定时任务

前言

       就像上一章举得例子,有的时候我们希望应用能够每隔一段时间,自动做一些操作。比如,自动获取了第三方的数据更新,用于调整自己的业务;再比如一些更新频率低但查询频率高的数据,我们可以将数据查询到内存中,并设置每隔多久检查一次是否需要更新内存中缓存好的数据。这些操作都需要使用到定时任务

编写一个定时任务

       Egg 约定了定时任务文件统一存放于 app/schedule/ 位置,在 Egg 项目加载的过程中,会自动解析该目录下的文件,并以文件返回的对象来控制如何执行定时任务:

const Subscription = require('egg').Subscription;

class UpdateCache extends Subscription {
    // 通过 schedule 属性来设置定时任务的执行间隔等配置
    static get schedule() {
        return {
            // interval: '1m', // 1 分钟间隔
            cron: '*/15 * * * * *', // 也可以通过 cron 表达式来构建时间间隔
            type: 'all', // 指定所有的 worker 都需要执行
        };
    }

    // subscribe 是真正定时任务执行时被运行的函数
    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() 函数表示在定时任务执行时,真正执行的代码段。而属性 schedule 则相当于是为当前的定时器指定的配置:

属性 类型 描述
interval number 定时任务每隔 n 毫秒执行一次
- string 定时任务每隔 n 毫秒执行一次 (会将 ms 方式转换成毫秒,如 5m 代表 5分钟 )
cron string cron 表达式 来指定定时时机,如 0 0 */3 * * * 代表每隔3小时执行一次
cronOptions object 配置 cron 的时区等,参见 cron-parser 文档
type string all:代表每一个worker都会执行
worker:代表会随机选一个worker来执行此次定时任务
immediate boolean 配置了该参数为 true 时,这个定时任务会在应用启动并 ready 后立刻执行一次这个定时任务。
disable boolean 配置该参数为 true 时,这个定时任务不会被启动。
env Array 数组,仅在指定的环境下才启动该定时任务。

项目结构

// 这是一个 egg 项目的目录结构
├─ 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
│
上一篇下一篇

猜你喜欢

热点阅读