sourcetip

Spring Boot @EnableScheduling 조건부

fileupload 2023. 10. 20. 14:08
반응형

Spring Boot @EnableScheduling 조건부

애플리케이션 속성에 따라 @EnableScheduling을 조건부로 만드는 방법이 있습니까?또한 속성에 따라 컨트롤러를 비활성화하는 것도 가능합니까?

제가 이루고자 하는 것은 웹 요청을 처리하는 데 동일한 스프링 부트 응용 프로그램을 사용하고(그러나 동일한 컴퓨터에서 예약된 작업을 실행하지 않는) 백엔드 서버에 동일한 응용 프로그램을 설치하여 예약된 작업만 실행하는 것입니다.

제 앱은 이렇게 생겼습니다.

@SpringBootApplication
@EnableScheduling
@EnableTransactionManagement
public class MyApp {

   public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
   }

}

그리고 예정된 샘플 작업은 이렇게 보입니다.

@Component
public class MyTask {

   @Scheduled(fixedRate = 60000)
   public void doSomeBackendJob() {
       /* job implementation here */
   }
}

이 문제를 해결했습니다. 다음은 다음과 같습니다.

  • 앱에서 @EnableScheduling 주석 제거
  • 애플리케이션 속성에 따라 스케줄링을 활성화/비활성화하기 위한 새 구성 클래스 및 조건부 추가

-

 @Configuration
 public class Scheduler {

    @Conditional(SchedulerCondition.class)
    @Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() {
        return new ScheduledAnnotationBeanPostProcessor();
    }
}

그리고 조건반은

public class SchedulerCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return Boolean.valueOf(context.getEnvironment().getProperty("com.myapp.config.scheduler.enabled"));
    }

}

또한 백엔드 서버에서 웹 서버를 비활성화하려면 application.properties 파일에 다음을 추가하기만 하면 됩니다.

spring.main.web_environment=false

다음과 같이 콩 주입에 주석을 달 수 있습니다.

@Bean
@ConditionalOnProperty(prefix = "your.property", name = "yes", matchIfMissing = true)
public void doSomeBackendJob() {
       /* job implementation here */
}

보너스: 서로 다른 기계에서 서로 다른 것을 실행하기를 원하므로, 다른 구성을 가진 동일한 앱을 배포할 수 있으므로 스프링 프로파일을 사용할 수 있습니다. 이 경우 클래스나 메서드에 주석을 달 수 있습니다.

@Component
@Profile({ Constants.SPRING_PROFILE_PRODUCTION, Constants.SPRING_PROFILE_TEST })
public class TheClass{...}

스케줄링을 위해 별도의 @Configuration 클래스를 만들고 @ConditionalOnProperty 주석을 사용하여 스케줄링을 전환했습니다.

@Configuration
@EnableScheduling
@ConditionalOnProperty(prefix = "scheduling", name="enabled", havingValue="true", matchIfMissing = true)
public class SchedulerConfig {

}

내 어플에서 .yml파일을 추가했습니다.

scheduling:
  enabled: true
  1. 스케줄러가 구성이 아닌 것 같습니다.
  2. 설정할 필요 없음prefix인에@ConditionalOnProperty
  3. 스케줄러를 생성할 필요가 없습니다.@Bean구성 클래스에 있습니다.

나의 변형:

@Component
@EnableScheduling
@ConditionalOnProperty(value = "scheduler.enabled", havingValue = "true")
public class MyScheduler {

    @Scheduled(...)
    public void doWork() {
        ...
    }
}

사용하는 대신@ConditionalOnProperty스프링 프로파일을 사용하여 조건부로 스케줄링을 켜거나 끌 수도 있습니다.

먼저 스케줄링 구성 요소를 활성화할 스프링 프로파일을 정의해야 합니다.속성을 추가하여 활성 스프링 프로파일을 정의할 수 있습니다.spring.profiles.active당신에게application.properties파일. 예를 들어 프로파일의 이름을 짓겠습니다.cron.

spring.profiles.active=cron

다음으로 다음과 같은 스케줄링 구성 요소에 주석을 달겠습니다.@Profile("cron").

@Service
@EnableScheduling
@Profile("cron")
public class ScheduleService {

    @Scheduled(...)
    public void cronJob() {
        ...
    }
}

@Profile주석은 다음을 보장합니다.ScheduleService클래스는 다음과 같은 경우에만 활성화됩니다.cron프로파일이 설정되어 있습니다.클래스와 둘 다 설정되지 않은 경우@EnableScheduling주석은 에 의해 무시됩니다.spring.

당신은 또한 그것을 조합할 수 있습니다.cron다른 스프링 프로파일을 가진 프로파일입니다.예를 들어, 응용 프로그램이 프로덕션 모드에서 실행 중일 때만 cron 작업이 활성화되기를 원한다고 가정합니다.이 경우 다른 스프링 프로파일을 정의할 수 있습니다(예:prod)의 두 번째 조건으로 사용합니다.@Profile주석.먼저 추가합니다.prod스프링 부동산에 대한 프로파일입니다.

spring.profiles.active=prod,cron

다음에 조건을 변경합니다.@Profile대상:

@Profile("prod & cron")

.ScheduleService둘 다 활성일 때만 활성화됩니다.prod그리고.cron프로파일이 활성화됩니다.고급을 정의하는 방법에 대한 자세한 정보@Profile조건은 여기서 찾을 수 있습니다.

언급URL : https://stackoverflow.com/questions/39182633/spring-boot-enablescheduling-conditionally

반응형