分布式定时任务插件.zip
立即下载
资源介绍:
分布式定时任务插件
# 编写定时任务
例:我们在app/schedule 目录下创建一个
pvSchedule.ts文件
```js
import {AbstractSchedule} from '@umajs/plugin-schedule'
export default class PvSchedule extends AbstractSchedule {
constructor(app){
super(app)
this.scheduleInfo = {
// rule:'0 0/1 * * * ?', // 每1分鐘更新一次
// name:'PV', // 定时任务名称
// switch:true, // 开启定时任务
}
}
/**
* 业务实现
*/
public task() {
// todo task
}
}
```
### 配置
1,在config/plugin.config.ts开启
```js
'schedule': {
enable: true,
}
```
2,新建schedule.config.ts,在其中填入配置项
```js
export default [
{
task: PvSchedule, // 定时任务类
auto: true, // true 代表自动执行,false代表手动执行
mark:"pv" // 任务标记
},
{
...
}]
```
3,controller 初始化定时任务参数配置
```js
export default class PvSchedule extends AbstractSchedule {
constructor(app){
super(app)
this.scheduleInfo = {
rule:'0 0/1 * * * ?', // 每1分鐘更新一次
name:'PV', // 定时任务名称
switch:true, // true:开启定时任务; false:关闭定时任务
...app
}
}
/**
* 业务实现
*/
public task() {
// todo task
}
}
```
### 任务
- 手动启动定时任务
```js
import { umaTask } from '@umajs/plugin-schedule'
umaTask("pv").start()
```
- 自动启动
```js
auto: true
```
- 手动关闭定时任务
```js
umaTask("pv").cancel()
```
### 定时方式
- Cron风格定时器 (建议使用Cron风格,避免服务器时间不一致)
```js
* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ |
│ │ │ │ │ └ 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)
6个占位符从左到右分别代表:秒、分、时、日、月、周几
```
- interval风格定时器,更多配置参考 node-schedule
```js
import * as schedule from 'node-schedule';
let rule = new schedule.RecurrenceRule();
rule.second =[0,1,2,3......59] 每秒执行
rule.second =0 每分钟0秒执行
rule.minute =0 每小时30分执行
this.scheduleInfo = {
rule, // 每1分鐘更新一次
}
```
### 集群/分布式部署 执行定时任务
- 插件包含在分布式部署下,需要保证同一个定时任务只能运行一次,所以需要用事物锁来控制;
- 插件采用的是分布式事务锁方案,支持单台redis和多台redis方案,基于 ioredis 实现
```js
import * as RedLock from 'redlock'
import * as Redis from 'ioredis';
const client1 = new Redis({
host: 'redis1.example.com',
port: 6379,
family: 4,
db: 0,
pass: 'xxx',
password: 'xxx',
});
const client2 = new Redis({
host: 'redis2.example.com',
port: 6378,
family: 4,
db: 0,
pass: 'xxx',
password: 'xxx',
});
this.scheduleInfo= {
rule: '0 0/1 * * * ?', // 每1分鐘更新一次
name: 'pv', // 任务名称
switch: true, // 定时任务开启
redLock:new RedLock([client1,client2]), // 采用redis锁
redLockTKL:10000 ,//单位毫秒,锁的生存时间,在该时间内,若锁未释放,强行释放 避免死锁情况
sleep:1000 //单位毫秒,执行任务后主动释放锁的时间
}
```
免责声明:
1.本资源仅供学习和交流使用,不保证其准确性、完整性、及时性或适用性。
2.本资源仅包含一般信息,不构成专业建议。在使用本资源时,请务必自行研究并谨慎决策。
3.我已尽力确保本资源的正确性和合法性,但不对其准确性、完整性和及时性做出保证。
4.本资源不应用于商业用途。
5.在使用本资源的过程中,用户应自行承担所有风险和责任,并遵守相关法律法规。
6.对于因使用本资源而产生的任何损失或损害,我概不负责。
请确保在使用本资源时仔细阅读并遵守以上免责声明。如果您有任何疑问或需要进一步帮助,请联系我。
资源最后修改时间:2024-09-24 21:32:40
22445350071281
0f63a3e4-5f51-46d4-8c95-b50d3e54b981