使用变量的Spring @Scheduled cron表达式

10
在我们的系统中,我们使用一个设置类来指向属性文件,根据不同的事件加载不同的属性文件。要访问特定属性,我们调用“Settings.getString('property_name_here')”。 在我的代码中,我将计划表达式 (@scheduled cron expression) 加载到一个变量中,并尝试将其传递给 @scheduled 注释,但它不起作用。 以下是我的代码: 在属性文件中:
cron.second=0
cron.min=1
cron.hour=14

在构造函数中,我有以下内容:

this.cronExpression = new StringBuilder()
            .append(settings.getString("cron.second"))
            .append(" ")
            .append(settings.getString("cron.min"))
            .append(" ")
            .append(settings.getString("cron.hour"))
            .append(" ")
            .append("*").append(" ").append("*").append(" ").append("*")
            .toString();

您好,需要翻译的内容如下:

这将创建一个字符串“0 1 14 * * *”,它是有效的con表达式。

在计划任务中,我有:

@Scheduled(cron = "${this.cronExpression}")
public void scheduleTask() throws Exception {
         ....
 }

当我运行代码时,它报错了:

Caused by: java.lang.IllegalStateException: 遇到无效的 @Scheduled 方法 'scheduleTask':Cron 表达式必须由 6 个字段组成(在 "${this.cronExpression}" 中找到 1 个)

然后我将 this.cronExpression 更改为字符串列表:

    this.cronExpression = Lists.newArrayList();
    this.cronExpression.add(settings.getString("cron.second"));
    this.cronExpression.add(settings.getString("cron.min"));
    this.cronExpression.add(settings.getString("cron.hour"));
    this.cronExpression.add("*");
    this.cronExpression.add("*");
    this.cronExpression.add("*");

但仍然出现了相同的错误,那么cron表达式应该是什么?


1
请看这里。我认为你想要实现的功能不被支持(在此处使用变量)。也许你可以将完整的cron表达式放在属性中,并在需要时使用它,如果这对你是可行的话。 - lzagkaretos
谢谢,它解释了一切。 - user468587
你能否请发布一下你最终实现的解决方案?你是如何成功使用变量来调用cron的? - Victor
1个回答

11

以下是我所做的,而且它对我有效:

在属性文件中:

my.cron.expression=0 3 * * * ?

在代码中:

@Scheduled(cron = "${my.cron.expression}")
public void scheduleTask(){
  ...
}

3
你好, 你发布的解决方案是一个静态cron,而不是从变量中获取信息。它只是将硬编码的值替换为属性文件中的引用。 - Tushar Banne
是的,你说得对。那正是我此刻所需要的。也是我在发现这个问题时正在寻找的 ;) - Joanna Kotuła

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接