任务调度
提示
本文档从 v3.6.0 版本起废弃。
@midwayjs/task 是为了解决任务系列的模块,例如分布式定时任务、延迟任务调度。例如每日定时报表邮件发送、订单2小时后失效等工作。
分布式定时任务依赖 bull,其通过 redis 进行实现,所以配置中,需要配置额外的 Redis,本地定时任务基于 Cron 模块,不需要额外配置。
相关信息:
| 描述 | |
|---|---|
| 可用于标准项目 | ✅ |
| 可用于 Serverless | ❌ |
| 可用于一体化 | ✅ |
其他
| 描述 | |
|---|---|
| 可作为主框架独立使用 | ✅ |
| 包含自定义日志 | ✅ |
| 可独立添加中间件 | ❌ |
安装依赖
首先安装 Midway 提供的任务组件:
$ npm install @midwayjs/task@3 @types/bull --save
或者在 package.json 中增加如下依赖后,重新安装。
{
"dependencies": {
"@midwayjs/task": "^3.0.0",
// ...
},
"devDependencies": {
"@types/bull": "^3.15.8",
// ...
}
}
引入组件
在 configuration.ts 中,引入这个组件:
// src/configuration.ts
import { Configuration } from '@midwayjs/core';
import * as task from '@midwayjs/task'; // 导入模块
import { join } from 'path';
@Configuration({
imports: [task],
importConfigs: [join(__dirname, 'config')]
})
export class MainConfiguration {
}
分布式定时任务
这是我们最常用的定时任务方式。
分布式定时任务,可以做到分布在多个进程,多台机器去执行单一定时任务方式。
分布式定义任务依赖 Redis 服务,需要提前申请。
配置
在 config.default.ts 文件中配置对应的模块信息:
// src/config/config.default.ts
export default {
// ...
task: {
redis: `redis://127.0.0.1:32768`, // 任务依赖redis,所以此处需要加一个redis
prefix: 'midway-task', // 这些任务存储的key,都是midway-task开头,以便区分用户原有redis里面的配置。
defaultJobOptions: {
repeat: {
tz: "Asia/Shanghai" // Task等参数里面设置的比如(0 0 0 * * *)本来是为了0点执行,但是由于时区不对,所以国内用户时区设置一下。
},
},
},
}
有账号密码情况:
// src/config/config.default.ts
export default {
// ...
task: {
// ioredis的配置 https://www.npmjs.com/package/ioredis
redis: {
port: 6379,
host: '127.0.0.1',
password: 'foobared',
},
prefix: 'midway-task', // 这些任务存储的 key,都是 midway-task 开头,以便区分用户原有redis 里面的配置。
defaultJobOptions: {
repeat: {
tz: "Asia/Shanghai" // Task 等参数里面设置的比如(0 0 0 * * *)本来是为了0点执行,但是由于时区不对,所以国内用户时区设置一下。
},
},
},
}
代码使用
import { Provide, Inject, Task, FORMAT } from '@midwayjs/core';
@Provide()
export class UserService {
@Inject()
helloService: HelloService;
// 例如下面是每分钟执行一次,并且是分布式任务
@Task({
repeat: { cron: FORMAT.CRONTAB.EVERY_MINUTE}
})
async test() {
console.log(this.helloService.getName())
}
}