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

新手上路,请多包涵

我正在使用 Spring Boot 并在使用数据库中现有的值安排 cron task 问题。

目前,我正在从如下属性文件中读取值:

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

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

原文由 Daniel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

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

 @Autowired
private CronRepository cronRepo;

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

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

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

希望它适用于您的问题。

原文由 Vignesh 发布,翻译遵循 CC BY-SA 4.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。

原文由 FatalFzrry 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题