it-source

Spring Boot : 데이터베이스에서 @Scheduled cron 값을 가져옵니다.

criticalcode 2023. 3. 17. 21:41
반응형

Spring Boot : 데이터베이스에서 @Scheduled cron 값을 가져옵니다.

사용하고 있다Spring Boot스케줄에 문제가 있습니다.cron task데이터베이스에 있는 값을 사용합니다.

당분간 다음과 같은 속성 파일에서 값을 읽습니다.

@Scheduled(cron= "${time.export.cron}")
public void performJob() throws Exception {
   // do something
}

이 방법은 잘 작동하지만 속성 파일에서 값을 가져오는 대신 데이터베이스 테이블에서 값을 가져오고 싶습니다.가능성과 방법은?

spring Boot Application 메인클래스 또는 임의의 컨피규레이션클래스의 데이터베이스에서 cron 값을 취득하기 위해 bean을 추가할 수 있습니다.코드 예는 다음과 같습니다.

@Autowired
private CronRepository cronRepo;

@Bean
public int getCronValue()
{
    return cronRepo.findOne("cron").getCronValue();
}

테이블을 만들고 데이터베이스에 적절한 값을 제공해야 합니다.그 후, 그 안에 있는 콩을 제공할 수 있습니다.@Scheduled코드 예는 다음과 같습니다.

@Scheduled(cron="#{@getCronValue}")

문제가 해결되길 바랍니다.

@Bean 주석이 달린 메서드를 사용하면 문제가 해결됩니다.그러나 Spring Boot는 이 메서드를 한 번만 호출하고 캐시된 버전을 반환하므로 새로운 값을 얻으려면 Spring을 재시작해야 합니다.

데이터베이스에서 새 실행 시간을 가져오려면 SchedulingConfigr를 사용합니다.

@Configuration
public class SchedulerConfig implements SchedulingConfigurer {

    @Autowired
    private YourService yourService;

    @Bean
    public YourJob yourJob() {
        return new YourJob();
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(
                () -> yourJob().performJob(),
                (TriggerContext triggerContext) -> yourService.getCron()
        );
    }

}

주의: @Scheduled는 이 방법으로 사용하지 마십시오.

목표를 달성하려면 실행 시 스케줄러를 구성해야 합니다.즉, 보다 낮은 수준의 스케줄러 API를 사용해야 합니다.데이터베이스와의 접속을 이미 준비하고 있는 경우는, 스케줄러를 설정할 수 있습니다.@Scheduled annotation을 사용하지 말고 스케줄러를 관리해야 할 것 같습니다.

다음 토픽이 제 뜻을 설명하는 데 도움이 될 것 같습니다.

  1. 실행 시 스프링의 @Scheduled fixed Delay를 변경하는 방법

  2. 스프링을 사용하여 프로그래밍 방식으로 작업 예약(fixedRate가 동적으로 설정됨)

단, 빈 작성을 대행하고 주석의 원래 주석을 커스텀 메타데이터로 대체하는 와일드 어프로치를 항상 사용할 수 있지만 이를 구현하려면 많은 프레임워크 세부사항과 @Scheduled Annatation 프로세서가 어떻게 작동하는지 알아야 합니다.

값이 저장된 데이터베이스 테이블에서 속성을 로드해야 합니다.해당 DB 속성을 응용 프로그램 속성과 병합합니다.

    @Autowired
    private DataSource dataSource;

    @Autowired
    private DatabaseConfiguration configuration;

    @Bean(name = "propertyConfig")
    public DatabaseConfiguration getDatabaseConfiguration() {
        DatabaseConfiguration configuration = new DatabaseConfiguration(dataSource, "propertyTable", "key", "value");
        return configuration;
    }

    @Bean(name = "dbProperty")
    public Properties getDBProperties(){
        Properties properties = ConfigurationConverter.getProperties(configuration);
        return properties;
    }

상세한 것에 대하여는, https://analyzejava.wordpress.com/2015/01/16/loading-configuration-properties-from-database-in-spring-based-application/ 를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/37113327/spring-boot-getting-scheduled-cron-value-from-database

반응형