在spring scheduler中使用属性文件中的cron值

mv1qrgav  于 2022-11-21  发布在  Spring
关注(0)|答案(4)|浏览(117)

我在我的Sping Boot 应用程序中使用Spring Schedular。我已经在属性文件中定义了cron表达式:

batch.delete-job.cron=0 0 0 * * *

我在用@Scheduled Annotation注解的方法中使用此值,如下所示:

@Scheduled(cron = "${batch.delete-job.cron}")
public void doBatchJob() {

}

我不断收到错误消息:
遇到无效的@Scheduled 方法“doBatchJob”:Cron表达式必须包含6个字段(在“${batch.delete-job.cron}”中找到1个)
如果我在注解中直接使用cron表达式,那么它就可以工作。

nmpmafwu

nmpmafwu1#

将此添加到您的应用程序上下文-

public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
       return new PropertySourcesPlaceholderConfigurer();
    }

如果这样做不成功,请尝试删除两个位置(您的代码和应用程序属性)中的连字符,并以分隔。例如-${batch.delete.job.cron}

s8vozzvw

s8vozzvw2#

从属性名称中删除连字符并没有什么不同,但我还是这样做了。解决问题的方法是将以下引用属性文件的注解放在包含doBatchJob()方法的类上。工作解决方案如下所示:

@PropertySource("classpath:/config.properties")
@EnableScheduling
@Component
public class DeleteBatch {

  @Scheduled(cron = "${batch.delete.job.cron}")
  public void doBatchJob() {

  }
}
ippsafx7

ippsafx73#

CRON是一个广泛使用的特性,但它的缺点之一是可读性差。如果一个非程序员需要设置一个定义调度的属性,这将是一项具有挑战性的任务。想象一下,如果你可以写这样的东西:@Scheduled(fixedRate = 9h),用于每9小时调度一次作业(或将“9h”移到属性文件中)。我自己写了一个特性,可以让你做到这一点。请看here的解释。这个特性可以在MgntUtis开源库中找到。这个库可以作为Maven artifactGit找到。使用这个特性需要编写比使用注解多一点的代码,但是提供了一种用户友好的格式。

lx0bsm1f

lx0bsm1f4#

对于那些使用
application.yml
首先将cron属性设置到应用程序.yml文件中。

scheduler:
   cron: '0 0 0 * * *'
  • 注意:在单引号内设置cron表达式的值。

然后,它可以与作为cron值的Scheduled参数一起使用。
例如:
而不是:

@Scheduled(cron = “0 0 0 * * *”)
public void scheduledJob() {
   System.out.println("Scheduled job has been executed")
}

您可以用途:

@Scheduled(cron = “${scheduler.cron}”)
public void scheduledJob() {
   System.out.println("Scheduled job has been executed")
}

相关问题