programing

Spring@Scheduled에 시간대를 제공하시겠습니까?

cafebook 2023. 8. 16. 22:37
반응형

Spring@Scheduled에 시간대를 제공하시겠습니까?

Spring 기반 @Scheduled cron 작업의 표준 시간대를 구성하려면 어떻게 해야 합니까?

배경:

저는 Spring's를 사용하여 하루에 한 번, 예를 들어 오후 2시에 실행되는 작업이 있습니다.@Scheduled주석:

@Scheduled(cron = "0 0 14 * * *")
public void execute() {
    // do scheduled job
}

문제는 2PM이 서버마다 다르다는 것입니다. 왜냐하면 Spring이 사용하기 때문입니다.TimeZone.getDefault() 내부적으로게다가, 의 JavaDoc.TimeZone.getDefault()다음과 같은 상태:

이 호스트의 기본 시간대를 가져옵니다.기본 시간대의 소스는 구현에 따라 달라질 수 있습니다.

즉, 시간대가 결정되지 않습니다.JVM 구현, 서버 표준 시간대 구성, 서버 위치 및/또는 기타 알 수 없는 요인에 따라 달라질 수 있습니다.결과적으로 cron 작업은 사용해야 할 시간대를 명시적으로 설정할 방법이 없는 한 서로 다른 서버에서 서로 다른 시간에 트리거됩니다.

Spring 3.2.2를 사용하고 있습니다.


갱신하다

봄 4일부로 봄 지라 문제 SPR-10456이 해결되었습니다.결과적으로,@Scheduled주석에 정확히 이 목적을 위한 새 영역 속성이 있습니다.

알고 보니 사용할 수 없었습니다.@Scheduled주석을 달았지만 해결 방법을 구현했습니다.Scheduling Configurer의 JavaDoc에는 다음과 같이 명시되어 있습니다.

[SchedulingConfigurer is] 일반적으로 @Scheduled 주석을 사용하는 선언적 접근 방식과 달리 스케줄링된 작업을 실행할 때 사용할 특정 작업 스케줄러를 설정하거나 프로그래밍 방식으로 스케줄링된 작업을 등록하는 데 사용됩니다.

그런 다음 cron 작업을 변경하여Runnable인터페이스를 사용한 다음 구성 파일을 업데이트하여SchedulingConfigurer아래 참조:

@Configuration
@EnableScheduling
@ComponentScan("package.that.contains.the.runnable.job.bean")
public class JobConfiguration implements SchedulingConfigurer {

    private static final String cronExpression = "0 0 14 * * *";
    private static final String timeZone = "CET";

    @Autowired
    private Runnable cronJob;

    @Bean
    CronTrigger cronTrigger() {
        return new CronTrigger(cronExpression, TimeZone.getTimeZone(timeZone));
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addCronTask(new CronTask(job, cronTrigger()));
    }
}

자세한 내용은 @EnableScheduling의 JavaDoc을 참조하십시오.


갱신하다

봄 4일부로 봄 지라 문제 SPR-10456이 해결되었습니다.결과적으로,@Scheduled주석에는 정확히 이 목적을 위한 새로운 영역 속성이 있습니다.

@Scheduled(cron = "0 0 14 * * *", zone = "CET")
public void execute() {
    // do scheduled job
}

요소가 있습니다.zone주석으로@Scheduled버전 4.0부터 시작합니다.

표준 시간대를 다음 사용자가 허용할 수 있는 문자열로 삽입할 수 있습니다.java.util.TimeZone.

코드는 다음과 같아야 합니다.

@Scheduled(cron = "0 0 14 * * *", zone = "GMT-5")
    public void execute() {
     // do scheduled job
}

"Zone"은 원하는 국가의 표준 시간대가 될 것입니다.

다음은 Spring과 함께 예약된 작업에 대한 좋은 튜토리얼입니다.

https://www.baeldung.com/cron-expressions

시간대를 사용할 수도 있습니다.@Scheduled in 다음과 .

@Scheduled(cron = "0 0 14 * * *" , zone = "GMT+5:00")
public void execute() {
    // do the scheduled job
}

다른 작업이나 응용 프로그램의 일부가 다른 표준 시간대를 사용하기를 원하는지 의심스럽습니다.모든 것이 일관되고 DRY로 유지되도록 하려면 모든 서버의 OS가 일관된 표준 시간대를 갖도록 구성하거나 모든 애플리케이션 서버에 대해 user.timezone Java 시스템 속성을 설정합니다.구성(OS, 애플리케이션 서버)을 중앙에서 관리하면 Puppet 및 Chef가 매우 유용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/15930171/provide-time-zone-to-spring-scheduled

반응형