본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Node.js/Nestjs (Nest.js)

[Nestjs] 스케줄 동기화(schedule blocking, keep overlapping)

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2023. 10. 17.

네스트에서 스케줄을 사용하기 위해서는 아래처럼 크론 데코레이터를 사용합니다.

  @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를 통해서 다시 실행해 주면 됩니다.

 

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글