기술나눔

SpringBoot daily: @Scheduled 구현은 서비스가 시작될 때 한 번 실행됩니다.

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


예약된 작업에 관해 말하면 @Scheduled, Quartz 및 XXL-JOB을 생각해야 합니다. 그러나 일부 단일 서비스나 소규모 프로젝트에서는 편의성과 속도를 위해 @Scheduled를 직접 사용하여 비동기 작업을 구현할 수 있습니다. 따라서 이 문서의 테마 요구 사항이 확장되었습니다.

프로젝트에서 @Scheduled를 사용하는 경우 프로젝트 시작 시 지정된 비동기 작업을 어떻게 미리 실행할 수 있나요?

1. @Scheduled에 대한 자세한 설명

@Scheduled 주석은 작업 실행 시간을 유연하게 제어하기 위한 여러 매개변수를 지원합니다.

  • cron: 초, 분, 시간, 일, 월, 주 등을 정확하게 제어할 수 있는 Cron 표현입니다.
    여기에 이미지 설명을 삽입하세요.
  • zone: 우리가 일반적으로 사용하는 시간대인 아시아/상하이와 같은 시간대를 수신합니다. 일반적으로 이 필드는 비워 둡니다.
  • fixedDelay: 마지막 실행 완료 시간이 지난 후 다시 실행되는 시간입니다. @Scheduled(fixedDelay = 5000) 등
  • fixedDelayString:fixedDelay와 동일한 의미를 갖지만 문자열 형식입니다. 유일한 차이점은 @Scheduled(fixedDelayString = "5000")과 같은 자리 표시자를 지원한다는 것입니다.
  • fixedRate: 마지막 실행 시간 시작 후 얼마나 오래 걸리는지(예: @Scheduled(fixedRate = 5000))
  • 고정RateString: 고정Rate와 동일한 의미를 갖지만 문자열 형식입니다. 유일한 차이점은 자리 표시자가 지원된다는 것입니다.
  • initialDelay: 처음 실행을 지연하는 시간입니다. 예를 들어 첫 번째 지연은 실행 전 1초이며, 이후에는 @Scheduled(initialDelay=1000,fixedRate=5000)에 따라 5초마다 실행됩니다. )
  • initialDelayString:initialDelayString과 동일한 의미를 갖지만 문자열 형식입니다. 유일한 차이점은 자리 표시자가 지원된다는 것입니다.

2. 로직 구현

1. 예약된 작업 논리 방법 만들기

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class ScheduledTest {

    @Scheduled(cron = "* 1 * * * ?")
    public void task1() throws Exception{
        System.out.println("task1 执行: " + Thread.currentThread() + "-" + DateTime.now());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2. 새로운 시작 실행 클래스 생성

이 클래스는 주로 시작 시 지정된 작업 메서드를 수동으로 호출합니다.

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class StartupTasks {

    private final ScheduledTest scheduledTasks;

    public StartupTasks(ScheduledTest scheduledTasks) {
        this.scheduledTasks = scheduledTasks;
    }

    @PostConstruct
    public void startUp() {
        try {
            System.out.println("服务启动执行任务");
            scheduledTasks.task1();
        }catch (Exception e){
			e.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

참고: 예약된 작업이 실행되도록 시작 클래스에 @EnableScheduling을 추가해야 합니다. 물론 이는 이 기사의 논리 테스트에 영향을 미치지 않습니다.

3. 테스트 결과

서비스 시작 후 인쇄정보를 확인하세요.
여기에 이미지 설명을 삽입하세요.