네스트에서 스케줄을 사용하기 위해서는 아래처럼 크론 데코레이터를 사용합니다.
@Cron(CronExpression.EVERY_SECOND, {
name: '잡이름',
}) // 매일 1분마다 실행됨
async 메서드이름(): Promise<void> {
//실행할 내용
}
위 샘플 코드는 매 1초마다 동작하는 코드 입니다.
그런데 하필 동작이 1초에 끝나지않는 상황이 발생하면 위 코드는 여러번 동작하게 됩니다.
이러한 현상을 방지하기 위해 간단하게 코드를 추가하여 해결가능 합니다.
의존성 주입을 통해 아래 클래스를 받습니다.
* 이름 : SchedulerRegistry
import { Cron, CronExpression, SchedulerRegistry } from '@nestjs/schedule';
@Injectable()
export class 스케줄러 {
constructor(
private schedulerRegistry: SchedulerRegistry ) { //의존성 주입
}
@Cron(CronExpression.EVERY_SECOND, {
name: '잡이름',
})
async 메서드이름(): Promise<void> {
}
}
그리고 동작할 메서드에 아래 코드를 넣어 줍니다.
stop과 start 함수를 잘 살펴봐야 합니다.
import { Cron, CronExpression, SchedulerRegistry } from '@nestjs/schedule';
@Injectable()
export class 스케줄러 {
constructor(
private schedulerRegistry: SchedulerRegistry ) { //의존성 주입
}
@Cron(CronExpression.EVERY_SECOND, {
name: '잡이름',
})
async 메서드이름(): Promise<void> {
const job = this.schedulerRegistry.getCronJob('잡이름');
job.stop(); //해당 일이 끝날 때 까지 중복실행을 멈춥니다.
//원하는 행동을 하고..
job.start(); //다시 켜 줍니다.
}
}
stop 함수를 통해서 해당 일(job)을 멈추게되면 크론(cron) 설정에 의해 해당 일(job)을 다시 하는 순간이 오더라도 해당 일(job)이 끝날 때 까지 중복해서 실행되지 않게 됩니다.
해당일이 끝나고 나면 start를 통해서 다시 실행해 주면 됩니다.
반응형
'Node.js > Nestjs (Nest.js)' 카테고리의 다른 글
NestJS SSE (Server-Sent Events) (0) | 2023.07.19 |
---|---|
Nestjs 프레임워크 서버(일반 웹소켓 사용하기, websocket, socket.io 말고) (2) | 2023.05.25 |
Nestjs 프레임워크 서버(microservices, mqtt) -17 (2) | 2022.10.11 |
Nestjs 프레임워크 서버(log, winston) -16 (2) | 2022.10.04 |
Nestjs 프레임워크 서버(emitter, rxjs, schedule) -15 (0) | 2022.09.22 |
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)
댓글