在cron中表达

时间:2017-07-18 20:18:51

标签: java cron

我想在java中运行一个cron,它将运行每个' x'每天一小时。 X将由数据库中非静态的值决定。我试过这样的事情:

private static String cronRunTime = getCronRunTimeFromDb();
private String cronExpression = "* " + cronRunTime + " * * *";

但我面临的主要问题是我无法获得如何在@Scheduled注释中配置此值。

我试了一下:

@Scheduled(cron = cronExpression)
    public void myCron(){

    }

但是我在编译期间遇到错误:

error: element value must be a constant expression
    @Scheduled(cron = cronExpression)

有人可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

根据原始类型的注释元素的Java specification值,String必须是constant expressions - 可以在编译时评估,而不是在运行时评估。

简而言之:您无法将在运行时计算的值(从数据库中获取,从属性文件中读取,甚至从System.currentTimeMillis()等静态函数返回)传递给注释属性

如果您的计划任务的动态逻辑取决于某种配置(在数据库或属性文件中),您应该考虑使用ScheduledTaskRegistrar及其addCronTask(CronTask task)方法,这当然是不像简单的注释那样整洁。

请参阅此处有关如何在回复中使用ScheduledTaskRegistrar的示例:

作为替代方案,您可以使用属性占位符逻辑来填充cron注释的@Scheduled属性,如其他问题中所述:

如果你真的要狂野,你甚至可以让Spring从数据库中读取属性,请参阅:

答案 1 :(得分:0)

" sec工作日的最小时工作日"

" 0 0 *? * *"是每天每小时的cron表达 " 0 0 10? * *"是每天上午10点的cron表达。

每个" x"每天的时间是:

" 0 0 * / x? * *"

希望有所帮助。