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
- 스케줄러가 구성이 아닌 것 같습니다.
- 설정할 필요 없음
prefix
인에@ConditionalOnProperty
- 스케줄러를 생성할 필요가 없습니다.
@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
'sourcetip' 카테고리의 다른 글
아이폰 시스템 폰트 (0) | 2023.10.25 |
---|---|
Swift UI에서 텍스트에 대한 사용자 지정 글꼴 크기 (0) | 2023.10.20 |
우커머스 주문 복원 (0) | 2023.10.20 |
localStorage의 크기를 찾는 방법 (0) | 2023.10.20 |
MySQL은 마스터에서는 더 빠르게 선택되지만 슬레이브에서는 더 느리게 선택됩니다. (0) | 2023.10.20 |