Spring Boot:从数据库获取@Scheduled cron值

时间:2016-05-09 10:23:08

标签: java spring-boot cron scheduled-tasks

我正在使用Spring Boot并且使用数据库中存在的值调度cron task时出现问题。

暂时,我正在读取属性文件中的值,如下所示:

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

这很好用,但我没有从属性文件中获取值,而是想从数据库表中获取它们。它有可能吗?如何?

4 个答案:

答案 0 :(得分:7)

您可以添加一个bean以从SpringBootApplication主类或任何配置类中的数据库获取cron值。示例代码如下:

@Autowired
private CronRepository cronRepo;

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

您应该创建一个表并在数据库中提供合适的值。之后,您可以在@Scheduled中提供bean。示例代码如下:

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

希望它适合您的问题。

答案 1 :(得分:1)

要实现目标,必须在运行时配置调度程序。这意味着您需要使用更多低级调度程序API。准确地说,当您已经准备好连接数据库时,您可以配置您的调度程序。我认为您需要摆脱使用@Scheduled注释并手动管理您的调度程序。

我认为这些主题有助于描述我的意思:

  1. How to change Spring's @Scheduled fixedDelay at runtime

  2. Scheduling a job with Spring programmatically (with fixedRate set dynamically)

  3. 但是,您总是可以使用野生方法拦截bean创建并使用自定义元数据替换注释上的原始注释,但为了实现它,您必须知道许多框架细节以及@Scheduled annatation处理器的工作方式。

答案 2 :(得分:1)

您需要从存储值的数据库表中加载属性。 并将该数据库属性与应用程序属性合并

    @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/

答案 3 :(得分:0)

使用@Bean批注方法可以解决问题。但是由于SpringBoot只会调用此方法1次,然后返回缓存的版本,因此您将需要重新启动Spring以获取新值。

要使用SchedulingConfigurer从数据库获取新的运行时间:

@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。