Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/yanqic/nest-schedule
https://github.com/yanqic/nest-schedule
Last synced: 11 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/yanqic/nest-schedule
- Owner: yanqic
- License: mit
- Created: 2021-08-17T03:35:27.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2024-05-24T01:47:19.000Z (8 months ago)
- Last Synced: 2024-12-24T21:34:00.608Z (15 days ago)
- Language: TypeScript
- Size: 345 KB
- Stars: 3
- Watchers: 1
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Nestjs Schedule
## Description
Distributed Schedule module for [Nest.js](https://github.com/nestjs/nest) based on the node-schedule package.
## Installation
```bash
$ npm i --save nestjs-schedule
```## Usage
```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');
}
}
```### Dynamic Schedule Job
```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');
}
}
```### Distributed Support
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');
}
}
```## API
### class ScheduleModule
#### static forRoot\(\): DynamicModule
Import schedule module.
### class Schedule
#### 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
## Decorators
### Cron(rule: string | number | Date | CronObject | CronObjLiteral, options?: CronOptions): MethodDecorator
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 |[CronObject CronObjLiteral](https://github.com/yanqic/nest-schedule/blob/main/lib/interfaces/cron-options.interface.ts)
### Interval(timeout: number): MethodDecorator
### Interval(name: string, timeout: number): MethodDecorator
### Interval(name: string, timeout: number, options?: IntervalOptions): MethodDecorator
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 |### Timeout(timeout: number): MethodDecorator
### Timeout(name: string, timeout: number): MethodDecorator
### Timeout(name: string, timeout: number, options?: TimeoutOptions): MethodDecorator
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 |### InjectSchedule(): PropertyDecorator
Inject Schedule instance
### UseLocker(locker: Locker | Function): MethodDecorator
Set a distributed locker for job.
## Stay in touch
- Author - [yanqic](https://github.com/yanqic)
## License
NestCloud is [MIT licensed](LICENSE).