【问题标题】:Cronjob Quartz format in ymlyml 中的 Cronjob Quartz 格式
【发布时间】:2021-02-15 01:31:44
【问题描述】:

我有包含该条目的 application.yml:

cron:
  scheduler:
     expr: 0 0/60 * * * ?

当我尝试在我的 Quarkus 调度程序中注入该属性时,我收到以下消息:

IllegalArgumentExpression: Cron expression contains 1 parts but we expect one of [6, 7]

对于我尝试的每个示例,我都会收到此消息,但我无法解决问题。

偶数:

expr: "0 0/60 * * * ?"

没用。

@Scheduled(cron = "{cron.scheduler.expr}") 
void cronJobWithExpressionInConfig() {
   counter.incrementAndGet();
   System.out.println("Cron expression configured in application.yml");
}

我很高兴收到任何建议。

【问题讨论】:

  • 如何将此属性分配给 Quarkus 调度程序?
  • @marcin.programuje 查看我编辑的问题
  • 应该是@Scheduled(cron = "${cron.scheduler.expr}")
  • @marcin.programuje 注释确实需要$,如指南中指定的那样(参见下面的示例)。 @s_bei 您使用的是哪个版本的 Quarkus?当您传递有效的 cron 表达式时,1.9.0.Final 和 1.9.2.Final 都可以正常工作。请看下面的例子。期待您的反馈。

标签: java cron quarkus quartz


【解决方案1】:

根据this,注释中的值是正确的,但是如果您查看updating-the-application-configuration-file段落,则该指南正在使用文件application.properties

由于您使用的是 YAML 文件,我怀疑您没有包含所需的依赖项(已测试版本 1.9.0.Final1.9.2.Final):

    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-config-yaml</artifactId>
      <version>1.9.2.Final</version>
    </dependency>

与Spring相反,这个依赖必须在pom.xm文件中显式列出。

此外,我会以这种方式更改 YAML 文件:

cron:
  scheduler:
     expr: "0 0/60 * * * ?"

免责声明:我没有设法复制您的错误。提供的细节不够。

已编辑

请注意,cron 表达式本身是有问题的……'0/60' 没有意义。这是指定 cron 作业将发生的小时的分钟的部分,例如“0/40”表示希望在每小时的第 0 分钟和第 40 分钟执行作业,例如在 00:00, 00:40,..., 14:00, 14:40, ... 23:00 和 23:40。

所以你的表达式说要在 XX:00 和 XX:60 执行不存在的作业。

如果您在 Minutes 行中查看Cron Trigger Tutorial 的官方文档,它会明确指出接受的值在 [0-59] 范围内

示例

请注意以下(工作) java 类:

package com.acme.scheduled;

import io.quarkus.scheduler.Scheduled;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.TimeUnit;

public class ScheduledActions {

    private static final Logger LOGGER = LoggerFactory.getLogger(ScheduledActions.class);

    private static final int lengthFrame = 120;
    private static final int lengthText = lengthFrame - 4;
    private static final String FRAME = StringUtils.repeat('*', lengthFrame);

    private void printFancyText(final String text) {
        final String centeredText;

        if(text.length() > lengthText ) {
            centeredText = StringUtils.abbreviate(text,"...", lengthText);
        } else if ( text.length() == lengthText) {
            centeredText = text;
        } else {
            centeredText = StringUtils.center(text, lengthText);
        }

        LOGGER.info(FRAME);
        LOGGER.info("* {} *", centeredText);
        LOGGER.info(FRAME);
    }

    @Scheduled(cron = "{cron.scheduler.expr}")
    public void cronExpressionTrigger(){
        this.printFancyText("Firing from statically defined cron expression. Triggering method 'cronExpressionTrigger'.");
    }

    @Scheduled(delay = 5, delayUnit = TimeUnit.SECONDS, every = "PT15S")
    public void delayTrigger() {
        this.printFancyText("Firing from delay express in seconds. Triggering method 'delayTrigger'.");
    }

    @Scheduled(every = "30s")
    public void periodicTrigger(){
        this.printFancyText("Firing from statically defined period. Triggering method 'periodicTrigger'.");
    }

}

cron 表达式的值取自 application.yml 文件,定义如下:

cron:
  scheduler:
    expr: "0 0/1 * * * ?"       #   This works like a charm, with or without the '@' - I prefer with.
#    expr: "0 0/60 * * * ?"   >>> This does NOT work. It fails with error: java.lang.IllegalArgumentException: Period 60 not in range [0, 59]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 2019-11-13
    • 2020-10-31
    • 2012-07-23
    • 1970-01-01
    • 2016-02-18
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多