nestjs distributed timer schedule lib
npm install nestjs-scheduleDistributed Schedule module for Nest.js based on the node-schedule package.
``bash`
$ npm i --save nestjs-schedule
`typescript
import { Module } from '@nestjs/common';
import { ScheduleModule } from 'nestjs-schedule';
@Module({
imports: [ScheduleModule.forRoot({
// Optional: Import external dependent modules if you need
imports: [MyLockerModule]
// Optional: Inject your global custom lock
useClass: MyScheduleLocker
})],
})
export class AppModule {}
`
`typescript
import { Injectable, Logger } from '@nestjs/common';
import { Cron, Timeout, Interval } from 'nestjs-schedule';
@Injectable()
export class TasksService {
private readonly logger = new Logger(TasksService.name);
@Cron('45 *')
handleCron() {
this.logger.debug('Called when the current second is 45');
}
@Interval(5000)
handleInterval() {
this.logger.debug('Called every 5 seconds');
}
@Timeout(5000)
handleTimeout() {
this.logger.debug('Called after 5 seconds');
}
}
`
`typescript
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
import { InjectSchedule, Schedule } from 'nestjs-schedule';
@Injectable()
export class TasksService implements OnModuleInit {
private readonly logger = new Logger(TasksService.name);
constructor(@InjectSchedule() private readonly schedule: Schedule) {}
execute() {
this.logger.debug('execute dynamic job');
}
onModuleInit() {
this.schedule.createIntervalJob(this.execute.bind(this), 3000, {
name: 'test_job',
});
this.schedule.deleteIntervalJob('test_job');
}
}
`
1. Implements Locker interface
`typescript
import { Locker } from 'nestjs-schedule';
import { Injectable } from '@nestjs/common';
@Injectable()
export class ScheduleLocker implements Locker {
release(jobName: string): any {}
async tryLock(jobName: string): Promise
// use redis lock or other methods
return true;
}
}
`
2. Use your locker
`typescript
import { Injectable, Logger } from '@nestjs/common';
import { Cron, UseLocker } from '@nestjs-schedule';
import { ScheduleLocker } from './schedule-locker';
@Injectable()
export class TasksService {
private readonly logger = new Logger(TasksService.name);
@Cron('45 *')
// remove it if you want to use the lock which injected forRoot
@UseLocker(ScheduleLocker)
handleCron() {
this.logger.debug('Called when the current second is 45');
}
}
``
#### static forRoot\(\): DynamicModule
Import schedule module.
#### createTimeoutJob\(methodRef: Function, timeout: number, options?: TimeoutOptions\)
Dynamic create a timeout job.
| field | type | required | description |
| --------- | ------------ | -------- | -------------------- |
| methodRef | Function | true | job method |
| timeout | number | true | milliseconds |
| options | | false | see decorators |
| locker | Locker/false | false | custom lock instance |
> If the locker is configured as false, the default lock will be ignored
#### createIntervalJob\(methodRef: Function, timeout: number, options?: IntervalOptions\)
Dynamic create a interval job.
| field | type | required | description |
| --------- | ------------ | -------- | -------------------- |
| methodRef | Function | true | job method |
| interval | number | true | milliseconds |
| options | | false | see decorators |
| locker | Locker/false | false | custom lock instance |
#### createCronJob\(rule: string | number | Date | CronObject | CronObjLiteral, methodRef, options?: CronOptions\)
Dynamic create a cron job.
| field | type | required | description |
| --------- | -------------------------------------------- | -------- | -------------------- |
| rule | Date string number CronObject CronObjLiteral | true | the cron rule |
| methodRef | Function | true | job method |
| options | | false | see decorators |
| locker | Locker/false | false | custom lock instance |
#### deleteTimeoutJob\(name: string\)
Delete a timeout job
#### deleteIntervalJob\(name: string\)
Delete a interval job
#### deleteCronJob\(name: string\)
Delete a cron job
#### getTimeoutJobs\(\): TimeoutJobOptions[]
Get all timeout jobs
#### getIntervalJobs\(\): IntervalJobOptions[]
Get all interval jobs
#### getCronJobs\(\): CronJobOptions[]
Get all cron jobs
Schedule a cron job.
| field | type | required | description |
| --------------- | -------------------------------------------- | -------- | -------------------------------------------- |
| rule | Date string number CronObject CronObjLiteral | true | The cron rule |
| rule.dayOfWeek | number | true | Timezone |
| options.name | string | false | The unique job key.Distributed lock need it |
| options.retries | number | false | the max retry count, default is -1 not retry |
| options.retry | number | false | the retry interval, default is 5000 |
Schedule a interval job.
| field | type | required | description |
| ----------------- | ------- | -------- | -------------------------------------------- |
| timeout | number | true | milliseconds |
| options.retries | number | false | the max retry count, default is -1 not retry |
| options.retry | number | false | the retry interval, default is 5000 |
| options.immediate | boolean | false | executing job immediately |
Schedule a timeout job.
| field | type | required | description |
| ----------------- | ------- | -------- | -------------------------------------------- |
| timeout | number | true | milliseconds |
| options.retries | number | false | the max retry count, default is -1 not retry |
| options.retry | number | false | the retry interval, default is 5000 |
| options.immediate | boolean | false | executing job immediately |
Inject Schedule instance
Set a distributed locker for job.
- Author - yanqic
NestCloud is MIT licensed.