Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/miaowing/nest-schedule
A cron-like and not-cron-like job distributed scheduler for Nest.js by decorators.
https://github.com/miaowing/nest-schedule
cron microservice nest nest-schedule nestcloud nestjs
Last synced: about 1 month ago
JSON representation
A cron-like and not-cron-like job distributed scheduler for Nest.js by decorators.
- Host: GitHub
- URL: https://github.com/miaowing/nest-schedule
- Owner: miaowing
- License: mit
- Created: 2018-06-22T18:29:13.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2023-01-07T04:54:51.000Z (almost 2 years ago)
- Last Synced: 2024-10-04T02:08:49.779Z (about 1 month ago)
- Topics: cron, microservice, nest, nest-schedule, nestcloud, nestjs
- Language: TypeScript
- Homepage:
- Size: 439 KB
- Stars: 434
- Watchers: 11
- Forks: 35
- Open Issues: 37
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-nestjs - Nest Schedule - 装饰器实现的定时任务。 (资源 / 组件和库)
README
[travis-image]: https://api.travis-ci.org/nest-cloud/nestcloud.svg?branch=master
[travis-url]: https://travis-ci.org/nest-cloud/nestcloud
[linux-image]: https://img.shields.io/travis/nest-cloud/nestcloud/master.svg?label=linux
[linux-url]: https://travis-ci.org/nest-cloud/nestcloud# Nest Schedule
## Description
This is a [Nest](https://github.com/nestjs/nest) module for using decorator schedule jobs.
## Installation
```bash
$ npm i --save nest-schedule
```## Usage
```typescript
import { Module } from '@nestjs/common';
import { ScheduleModule } from 'nest-schedule';@Module({
imports: [
ScheduleModule.register(),
]
})
export class AppModule {
}
``````typescript
import { Injectable } from '@nestjs/common';
import { Cron, Interval, Timeout, NestSchedule } from 'nest-schedule';@Injectable() // Only support SINGLETON scope
export class ScheduleService extends NestSchedule {
@Cron('0 0 2 * *', {
startTime: new Date(),
endTime: new Date(new Date().getTime() + 24 * 60 * 60 * 1000),
})
async cronJob() {
console.log('executing cron job');
}
@Timeout(5000)
onceJob() {
console.log('executing once job');
}
@Interval(2000)
intervalJob() {
console.log('executing interval job');
// if you want to cancel the job, you should return true;
return true;
}
}
```### Dynamic Schedule Job
```typescript
import { Injectable } from '@nestjs/common';
import { InjectSchedule, Schedule } from 'nest-schedule';@Injectable()
export class ScheduleService {
constructor(
@InjectSchedule() private readonly schedule: Schedule,
) {
}
createJob() {
// schedule a 2s interval job
this.schedule.scheduleIntervalJob('my-job', 2000, () => {
console.log('executing interval job');
});
}
cancelJob() {
this.schedule.cancelJob('my-job');
}
}
```### Distributed Support
#### 1. Extend NestDistributedSchedule class
```typescript
import { Injectable } from '@nestjs/common';
import { Cron, NestDistributedSchedule } from 'nest-schedule';@Injectable()
export class ScheduleService extends NestDistributedSchedule {
constructor() {
super();
}
async tryLock(method: string) {
if (lockFail) {
return false;
}
return () => {
// Release here.
}
}
@Cron('0 0 4 * *')
async cronJob() {
console.log('executing cron job');
}
}
```#### 2. Use UseLocker decorator
```typescript
import { ILocker, IScheduleConfig, InjectSchedule, Schedule } from 'nest-schedule';
import { Injectable } from '@nestjs/common';// If use NestCloud, it supports dependency injection.
@Injectable()
export class MyLocker implements ILocker {
private key: string;
private config: IScheduleConfig;constructor(
@InjectSchedule() private readonly schedule: Schedule,
) {
}init(key: string, config: IScheduleConfig): void {
this.key = key;
this.config = config;
console.log('init my locker: ', key, config);
}release(): any {
console.log('release my locker');
}tryLock(): Promise | boolean {
console.log('apply my locker');
return true;
}
}
``````typescript
import { Injectable } from '@nestjs/common';
import { Cron, NestSchedule, UseLocker } from 'nest-schedule';
import { MyLocker } from './my.locker';@Injectable()
export class ScheduleService extends NestSchedule {
@Cron('0 0 4 * *')
@UseLocker(MyLocker)
async cronJob() {
console.log('executing cron job');
}
}
```## API
### class ScheduleModule
#### static register\(config: IGlobalConfig\): DynamicModule
Register schedule module.
| field | type | required | description |
| --- | --- | --- | --- |
| config.enable | boolean | false | default is true, when false, the job will not execute |
| config.maxRetry | number | false | the max retry count, default is -1 not retry |
| config.retryInterval | number | false | the retry interval, default is 5000 |
| config.waiting | boolean | false | the scheduler will not schedule job when this job is running, if waiting is true |### class Schedule
#### scheduleCronJob(key: string, cron: string, callback: JobCallback, config?: ICronJobConfig)
Schedule a cron job.
| field | type | required | description |
| --- | --- | --- | --- |
| key | string | true | The unique job key |
| cron | string | true | The cron expression |
| callback | () => Promise<boolean> | boolean | If return true in callback function, the schedule will cancel this job immediately |
| config.startTime | Date | false | The start time of this job |
| config.endTime | Date | false | The end time of this job |
| config.enable | boolean | false | default is true, when false, the job will not execute |
| config.maxRetry | number | false | the max retry count, default is -1 not retry |
| config.retryInterval | number | false | the retry interval, default is 5000 |
| config.waiting | boolean | false | the scheduler will not schedule job when this job is running, if waiting is true |
| config.immediate | boolean | false | running job immediately |#### scheduleIntervalJob(key: string, interval: number, callback: JobCallback, config?: IJobConfig)
Schedule a interval job.
| field | type | required | description |
| --- | --- | --- | --- |
| key | string | true | The unique job key |
| interval | number | true | milliseconds |
| callback | () => Promise<boolean> | boolean | If return true in callback function, the schedule will cancel this job immediately |
| config.enable | boolean | false | default is true, when false, the job will not execute |
| config.maxRetry | number | false | the max retry count, default is -1 not retry |
| config.retryInterval | number | false | the retry interval, default is 5000 |
| config.waiting | boolean | false | the scheduler will not schedule job when this job is running, if waiting is true |
| config.immediate | boolean | false | running job immediately |#### scheduleTimeoutJob(key: string, timeout: number, callback: JobCallback, config?: IJobConfig)
Schedule a timeout job.
| field | type | required | description |
| --- | --- | --- | --- |
| key | string | true | The unique job key |
| timeout | number | true | milliseconds |
| callback | () => Promise<boolean> | boolean | If return true in callback function, the schedule will cancel this job immediately |
| config.enable | boolean | false | default is true, when false, the job will not execute |
| config.maxRetry | number | false | the max retry count, default is -1 not retry |
| config.retryInterval | number | false | the retry interval, default is 5000 |
| config.immediate | boolean | false | running job immediately |#### cancelJob(key: string)
Cancel job.
## Decorators
### Cron(expression: string, config?: ICronJobConfig): MethodDecorator
Schedule a cron job.
| field | type | required | description |
| --- | --- | --- | --- |
| expression | string | true | the cron expression |
| config.key | string | false | The unique job key |
| config.startTime | Date | false | the job's start time |
| config.endTime | Date | false | the job's end time |
| config.enable | boolean | false | default is true, when false, the job will not execute |
| config.maxRetry | number | false | the max retry count, default is -1 not retry |
| config.retryInterval | number | false | the retry interval, default is 5000 |
| config.waiting | boolean | false | the scheduler will not schedule job when this job is running, if waiting is true |
| config.immediate | boolean | false | running job immediately |### Interval(milliseconds: number, config?: IJobConfig): MethodDecorator
Schedule a interval job.
| field | type | required | description |
| --- | --- | --- | --- |
| milliseconds | number | true | milliseconds |
| config.key | string | false | The unique job key |
| config.enable | boolean | false | default is true, when false, the job will not execute |
| config.maxRetry | number | false | the max retry count, default is -1 not retry |
| config.retryInterval | number | false | the retry interval, default is 5000 |
| config.waiting | boolean | false | the scheduler will not schedule job when this job is running, if waiting is true |
| config.immediate | boolean | false | running job immediately |### Timeout(milliseconds: number, config?: IJobConfig): MethodDecorator
Schedule a timeout job.
| field | type | required | description |
| --- | --- | --- | --- |
| milliseconds | number | true | milliseconds |
| config.key | string | false | The unique job key |
| config.enable | boolean | false | default is true, when false, the job will not execute |
| config.maxRetry | number | false | the max retry count, default is -1 not retry |
| config.retryInterval | number | false | the retry interval, default is 5000 |
| config.immediate | boolean | false | running job immediately |### InjectSchedule(): PropertyDecorator
Inject Schedule instance
### UseLocker(locker: ILocker | Function): MethodDecorator
Make your job support distribution.
If you use [NestCloud](https://github.com/nest-cloud/nestcloud), the Locker will support dependency injection, or not use injection please.## Stay in touch
- Author - [miaowing](https://github.com/miaowing)
## License
- NestSchedule is [MIT licensed](LICENSE).