我想在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)
有人可以帮我解决这个问题。
答案 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? * *"
希望有所帮助。