编写定时任务

  1. 有的时候,可能会希望 定期 做一些事情,比如:

    • 定期更新缓存
    • 定期删除一些不再使用的文件
    • 定期检查数据库,删除无意义的数据
    • 定期爬取一些数据,保存到数据库
  2. 尽管完全可以通过 setInterval 来处理该问题,但在 egg 中,可以非常简单的完成该操作,只需要在 app/schedule 文件夹中编写各种任务即可, egg 启动后,会读取该文件夹中的所有模块,把它们的导出当做任务定期执行;

方式 1

// app/schedule/cacheLocals
const Subscription = require("egg").Subscription;

module.exports = class extends Subscription {
  // 通过 schedule 属性来设置定时任务的执行间隔等配置
  static get schedule() {
    return {
      interval: "1m", // 1 分钟间隔
      type: "all", // 指定所有的 worker 都需要执行
    };
  }

  // subscribe 是真正定时任务执行时被运行的函数
  async subscribe() {
    console.log("更新缓存");
    const key = "province";
    const resp = await this.app.axios.get(`${this.config.$apiBase}/api/local`);
    //缓存
    this.app.redis.set(key, JSON.stringify(resp.data));
  }
};

方式 2

module.exports = {
  schedule: {
    interval: '1m', // 1 分钟间隔
    type: 'all', // 指定所有的 worker 都需要执行
  },
  async task(ctx) { // task 是真正定时任务执行时被运行的函数
    console.log("更新缓存");
    const key = "province";
    const resp = await ctx.app.axios.get(`${ctx.app.config.$apiBase}/api/local`);
    //缓存
    ctx.app.redis.set(key, JSON.stringify(resp.data));
  },
}

schedule 配置

无论使用哪一种方式,都必须提供 schedule 属性来配置任务

更多关于任务的操作参考

  1. interval:字符串,描述任务执行的间隔时间,参考

  2. cron:字符串,任务执行的契机,它和 interval 设置一个即可;

    "* */3 * * * * "  // 每隔 3 分钟执行一次
    "0 0 0 * * 3" // 每周 3 的凌晨执行一次
    "0 0 0 24 12 *" // 每年圣诞节执行一次
    
  3. type:任务类型,支持两种配置:

    • worker:只有一个 worker 会执行这个定时任务,每次执行定时任务的 worker 的选择是随机的
    • all:每个 worker 都会执行这个定时任务。
  4. immediate:如果设置为 true ,应用启动时会立即执行该任务

  5. env:数组,只有在指定的环境中才会启动该任务

  6. disable:一个开关,表示任务是否被禁用

打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 编写定时任务
    1. 1.1. 方式 1
    2. 1.2. 方式 2
  2. 2. schedule 配置