java - 使用带有 spring @Scheduled 表达式的参数
问题描述
我正在尝试参数化当前用于 Spring @Scheduled 表达式的 cron 表达式。来自客户端配置的所有其他变量似乎已为其他变量正确加载,但 Spring 似乎无法在 cron 表达式中获取任何内容。
我尝试了各种不同的方法,但似乎都没有奏效。抛出错误,如
java.lang.IllegalStateException: Encountered invalid @Scheduled method 'importData': Could not resolve placeholder 'cronExpression' in value "${cronExpression}"
我试过直接从配置文件中调用表达式
@Scheduled(cron = "${my.cron.expression}")
public void importData() {
使用 @Qualifier 并给它一个直接的字符串名称
@Qualifier("cronExpression") String cronExpression
this.cronExpression = cronExpression
...
@Scheduled(cron = "${cronExpression}")
public void importData() {
但是这些仍然返回上述错误信息
在客户端配置类中,我目前正在尝试像这样导入变量:
@Bean
@Qualifier("cronExpression")
public String cronExpression(@Value("${my.cron.expression}") String cronExpression) {
return cronExpression;
}
除了名称之外,这是我正在使用的代码,它仍然抛出一个未解决的占位符错误:属性:
my:
cron:
expression: 0 0 4-6 * * *
客户端配置:
@Qualifier("cronExpression")
public String cronExpression(@Value("${my.cron.expression}") String cronExpression) {
return cronExpression;
}
调度器:
private final String cronExpression;
...
@Qualifier("cronExpression") String cronExpression
...
this.cronExpression = cronExpression
...
@Scheduled(cron = "${cronExpression}")
解决方案
这是我的 Spring Java 类:
@EnableScheduling
@SpringBootApplication
@Slf4j
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Scheduled(cron = "${my.cron.expression}")
public void test(){
log.info("hello!");
}
}
这是我的application.yml配置文件:
my.cron.expression: 0 */1 * * * ?
使用此配置,我的日志每分钟触发一次。
(我没有添加特定的依赖项)
笔记
小心你的属性的字符串包装:尝试取消引用它,如果 Spring 给你一个错误。