在 spring-boot @Scheduled 中使用 fixedDelayString 而无需直接将配置 属性
Using fixedDelayString in spring-boot @Scheduled without putting the configuration property directly
这是我的问题。我在一些方法之上使用 @Scheduled
在我的 spring-boot 应用程序中执行一些常规任务。
为了配置时间表,我将 fixedDelayString
和 initialDelayString
参数用于 @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 似乎没有对 fixedDelayString
和 initialDelayString
占位符进行转换。
问题是这看起来真的很容易破解。我也在从通常的 @ConfigurationProperties
class 中读取相同的 属性。所以 IntelliJ 一直建议我在 属性 文件中使用 kebab-case 版本,即 my.wanted.delay-in-seconds
。我同意 - 那里更容易阅读。但如果我这样做,应用程序将无法启动。
所以我的问题是:有什么办法可以
- 要不,让 spring 进行通常的转换,以便 kebab-case 也能正常工作?
- 或者,从配置 属性 class 中提供延迟字符串而不是直接使用 属性?
谢谢!
正如@wjans 上面的评论所指出的,实现我想要的正确方法是使用 SEL 从我的属性 bean 中获取 bean 属性 并在 @Scheduled
参数中使用它。
像这样:
@Scheduled(
initialDelayString = "#{@myProps.getSchedulingDelayMillis()}",
fixedDelayString = "#{@myProps.getSchedulingDelayMillis()}"
)
这将从属性 class 中提取延迟字符串,因此您可以将需要的任何内容绑定到 属性 并使用它。
这是我的问题。我在一些方法之上使用 @Scheduled
在我的 spring-boot 应用程序中执行一些常规任务。
为了配置时间表,我将 fixedDelayString
和 initialDelayString
参数用于 @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 似乎没有对 fixedDelayString
和 initialDelayString
占位符进行转换。
问题是这看起来真的很容易破解。我也在从通常的 @ConfigurationProperties
class 中读取相同的 属性。所以 IntelliJ 一直建议我在 属性 文件中使用 kebab-case 版本,即 my.wanted.delay-in-seconds
。我同意 - 那里更容易阅读。但如果我这样做,应用程序将无法启动。
所以我的问题是:有什么办法可以
- 要不,让 spring 进行通常的转换,以便 kebab-case 也能正常工作?
- 或者,从配置 属性 class 中提供延迟字符串而不是直接使用 属性?
谢谢!
正如@wjans 上面的评论所指出的,实现我想要的正确方法是使用 SEL 从我的属性 bean 中获取 bean 属性 并在 @Scheduled
参数中使用它。
像这样:
@Scheduled(
initialDelayString = "#{@myProps.getSchedulingDelayMillis()}",
fixedDelayString = "#{@myProps.getSchedulingDelayMillis()}"
)
这将从属性 class 中提取延迟字符串,因此您可以将需要的任何内容绑定到 属性 并使用它。