首页 > 解决方案 > 使用带有 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}")

标签: javaspringspring-bootcron

解决方案


这是我的 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 给你一个错误。


推荐阅读