복붙노트

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

SPRING

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

Spring 기반 @Scheduled cron 작업의 시간대를 어떻게 구성 할 수 있습니까?

배경:

저는 Spring의 @Scheduled 주석을 사용하여 하루에 한 번씩, 오후 2시에 실행하는 작업을합니다.

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

문제는 Spring이 내부적으로 TimeZone.getDefault ()에서 사용하기 때문에 오후 2 시가 다른 서버마다 다릅니다. 또한 TimeZone.getDefault ()의 JavaDoc은 다음과 같이 설명합니다.

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

Spring 3.2.2를 사용하고있다.

최신 정보

Spring 4부터 Spring Jira 문제 SPR-10456이 해결되었습니다. 결과적으로 @Scheduled 주석은 정확히이 목적을위한 새로운 영역 속성을 갖습니다.

해결법

  1. ==============================

    1.@Scheduled 주석을 사용할 수 없다는 것이 밝혀졌지만 해결 방법을 구현했습니다. SchedulingConfigurer의 JavaDoc에는 다음과 같이 명시되어 있습니다.

    @Scheduled 주석을 사용할 수 없다는 것이 밝혀졌지만 해결 방법을 구현했습니다. SchedulingConfigurer의 JavaDoc에는 다음과 같이 명시되어 있습니다.

    다음으로 Runnable 인터페이스를 구현하도록 cron 작업을 변경 한 다음 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을 참조하십시오.

    최신 정보

    Spring 4부터 Spring Jira 문제 SPR-10456이 해결되었습니다. 결과적으로 @Scheduled 주석은 정확히이 목적을위한 새로운 영역 속성을 갖습니다.

  2. ==============================

    2.버전 4.0부터는 @Scheduled 주석에 요소 영역이 있습니다.

    버전 4.0부터는 @Scheduled 주석에 요소 영역이 있습니다.

    java.util.TimeZone에서 허용 할 수있는 문자열로 시간대를 삽입 할 수 있습니다.

  3. ==============================

    3.다른 시간대를 사용하기 위해 다른 작업이나 응용 프로그램의 일부를 원할 것입니다. 일관성있게 유지하고 DRY하고 싶다면 모든 서버의 OS를 일정한 시간대로 구성하거나 모든 응용 프로그램 서버의 user.timezone Java 시스템 등록 정보를 설정하십시오. 중앙에서 구성 (OS, 응용 프로그램 서버)을 관리하고 그 인형 및 주방장은 매우 유용 할 수 있습니다.

    다른 시간대를 사용하기 위해 다른 작업이나 응용 프로그램의 일부를 원할 것입니다. 일관성있게 유지하고 DRY하고 싶다면 모든 서버의 OS를 일정한 시간대로 구성하거나 모든 응용 프로그램 서버의 user.timezone Java 시스템 등록 정보를 설정하십시오. 중앙에서 구성 (OS, 응용 프로그램 서버)을 관리하고 그 인형 및 주방장은 매우 유용 할 수 있습니다.

  4. from https://stackoverflow.com/questions/15930171/provide-time-zone-to-spring-scheduled by cc-by-sa and MIT license