我一直在尝试设置@Scheduled的cron属性,如下所示。
public class ObjectScheduler {
@Value("${config.cron.expression}")
private static final CRON_EXPRESSION;
@Scheduled(cron = CRON_EXPRESSION, zone="GMT")
public void scheduledObjectFetch() {...}
}
我在这里得到了一个编译时的错误,它说
The value for the annotation attribute Scheduled.cron attribute must be a constant expression.
如果我直接在属性中给出表达式,同样的事情也可以实现。
@Scheduled(cron = "${config.cron.expression}", zone="GMT")
这里的值也是在运行时从配置中分配的,那么为什么这里没有给出一个编译时的错误?为什么当我使用@Value注解将其赋值给一个变量时,它不认为它是一个常量表达式?是我遗漏了什么吗?是由于Java还是Spring的@Value注解?
春天不会插入 @Value
变成静态字段,不过可以通过setter来实现。
这也适用于 static final
字段需要在编译时定义。
所以你不能配置 CRON_EXPRESSION
通过 @Value
只有当你把它设置为硬编码时,它才会工作。
private static final String CRON_EXPRESSION = "0 0 8 * * ?";
@Scheduled(cron = CRON_EXPRESSION, zone="GMT")
public void scheduledObjectFetch() {...}
在你的例子中,你把这个字段设置为 final
最根本的原因是你不能用 "A "来向字段注入值。@value
是Java用实际的值来替换代码中静态的最终 "变量 "的出现(因为在编译时当然知道)。所以,如果你删除了 final
的限定词,它应该可以为你使用弹簧 setter
注入。您不能使用@value从属性文件中注入值到一个 static final
变量,这是因为java处理最终静态变量的方式。
理想情况下,我们可以使用 春风化雨 填充cron从 property
通过提供类似于.com的文件,来实现。
@Component("scheduledAnnotationObjectScheduler")
public class ObjectScheduler {
@Scheduled(cron = "${cron.expression}")
public void scheduledObjectFetch() {...}
}
应用程序.属性
cron.expression=0 15 10 15 * ?
这应该可以解决 cron
理论上来说,从属性文件中获取的值,因为它是在组件扫描过程中获取的。