在 spring-boot @Scheduled 中使用 fixedDelayString 而无需直接将配置 属性

Using fixedDelayString in spring-boot @Scheduled without putting the configuration property directly

这是我的问题。我在一些方法之上使用 @Scheduled 在我的 spring-boot 应用程序中执行一些常规任务。

为了配置时间表,我将 fixedDelayStringinitialDelayString 参数用于 @Scheduled,如下所示:

@Scheduled(
      initialDelayString = "${my.wanted.delayInSeconds}",
      fixedDelayString = "${my.wanted.delayInSeconds}"
  )

它应该正常工作。

我现在遇到的问题是,在应用程序的属性文件中我必须将配置属性设置为:

my.wanted.delayInSeconds=10

如果我为 spring 属性使用任何其他支持的案例,例如 kebab-case:

my.wanted.delay-in-seconds=10

应用程序启动失败并出现异常:

Caused by: java.lang.IllegalStateException: Encountered invalid @Scheduled method 'myMethod': Could not resolve placeholder 'my.wanted.delayInseconds' in value "${my.wanted.delayInSeconds}"

这是有道理的,因为该值未定义并且 spring 似乎没有对 fixedDelayStringinitialDelayString 占位符进行转换。

问题是这看起来真的很容易破解。我也在从通常的 @ConfigurationProperties class 中读取相同的 属性。所以 IntelliJ 一直建议我在 属性 文件中使用 kebab-case 版本,即 my.wanted.delay-in-seconds。我同意 - 那里更容易阅读。但如果我这样做,应用程序将无法启动。

所以我的问题是:有什么办法可以

谢谢!

正如@wjans 上面的评论所指出的,实现我想要的正确方法是使用 SEL 从我的属性 bean 中获取 bean 属性 并在 @Scheduled 参数中使用它。

像这样:

@Scheduled(
      initialDelayString = "#{@myProps.getSchedulingDelayMillis()}",
      fixedDelayString = "#{@myProps.getSchedulingDelayMillis()}"
  )

这将从属性 class 中提取延迟字符串,因此您可以将需要的任何内容绑定到 属性 并使用它。