programing

봄에 프로필별 @예약된 작업을 활성화하는 방법은 무엇입니까?

muds 2023. 8. 9. 21:06
반응형

봄에 프로필별 @예약된 작업을 활성화하는 방법은 무엇입니까?

특정 프로필에서만 예약된 작업을 활성화하려면 어떻게 해야 합니까?

의사 코드:

@Scheduled(cron = "${job.cron}")
@Profile("prod")
public void runJob() {

}

그게 가능한가요?

프로필당 하나의 빈이 있어야 합니다.

@Component
@Profile("prod")
public class ProdJob {

    @Scheduled(cron = "${job.cron}")
    public void runJob() {

    }

}

@Component
@Profile("beta")
public class BetaJob {

    @Scheduled(cron = "${job.cron}")
    public void runJob() {

    }
}

다음과 같은 방법을 사용하여 이 작업을 수행할 수 있습니다.이미 그랬던 것처럼 콜론을 추가한 다음 속성을 찾을 수 없는 경우 선택해야 하는 기본값을 추가합니다.여기서 '-'를 cron disable 식으로 사용합니다.

@Scheduled(cron = "${job.cron:-}")
public void runJob() {

}

그런 다음 원하는 프로파일에 cron 식을 정의합니다(예: 속성 파일 사용).

application-prod.properties 콘텐츠는 다음과 같습니다.

job.cron=*/30 * * * * *

여기서 prod 프로필의 경우 30초마다 시작되고 다른 모든 경우에는 꺼집니다.

저는 스프링 부트 버전 2.3.7을 사용하고 있으며 이 문제에 대한 해결책은 당신이 제공한 유사 코드와 동일합니다.당신은 그들의 팀에 영감을 주었습니다 :-).

// Enable sceduling
@Configuration
@EnableScheduling
public class SchedulerConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();

        threadPoolTaskScheduler.setPoolSize(5);
        threadPoolTaskScheduler.setThreadNamePrefix("my.main.package-Scheduler-");
        threadPoolTaskScheduler.initialize();

        scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
    }
}

// A scheduled job that runs only when profile "prod" is enabled
@Component
@Profile("prod")
@NoArgsConstructor
class ExpirationNotificationScheduler {

    // Just for test, run each 10th second or each minute
    @Scheduled(cron = "10 * * * * *") // second, minute, hour, day of month, month, day(s) of week
    public void notifyExpiredAccounts() {
        System.out.println("Yes, I am a scheduled job.");
    }
}

언급URL : https://stackoverflow.com/questions/28782694/how-to-enable-scheduled-jobs-by-profile-in-spring

반응형