我正在使用Spring Boot
并且使用数据库中存在的值调度cron task
时出现问题。
暂时,我正在读取属性文件中的值,如下所示:
@Scheduled(cron= "${time.export.cron}")
public void performJob() throws Exception {
// do something
}
这很好用,但我没有从属性文件中获取值,而是想从数据库表中获取它们。它有可能吗?如何?
答案 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注释并手动管理您的调度程序。
我认为这些主题有助于描述我的意思:
Scheduling a job with Spring programmatically (with fixedRate set dynamically)
但是,您总是可以使用野生方法拦截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;
}
答案 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。