gst*_*low 7 java spring scheduled-tasks spring-scheduled spring-boot
我的代码中有以下注释
@Scheduled(fixedDelayString = "${app.delay}")
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我必须拥有这样的属性
app.delay=10000 #10 sec
Run Code Online (Sandbox Code Playgroud)
属性文件看起来不可读,因为我已经计算了以毫秒为单位的值。
有没有办法在那里传递 5m 或 30s 之类的值?
据我所知,你不能直接做到这一点。然而,春天启动配置性能做支持自动转换的参数等15s,并5m到Duration。
这意味着你可以创建一个@ConfigurationProperties这样的类:
@Component
@ConfigurationProperties("app")
public class AppProperties {
private Duration delay;
// Setter + Getter
}
Run Code Online (Sandbox Code Playgroud)
此外,由于您可以在注释中使用带有 Spring 表达式语言的 bean 引用@Scheduled,您可以执行以下操作:
@Scheduled(fixedDelayString = "#{@appProperties.getDelay().toMillis()}")
public void schedule() {
log.info("Scheduled");
}
Run Code Online (Sandbox Code Playgroud)
注意:使用这种方法时,您必须使用@Component注解注册您的配置属性。如果您使用@EnableConfigurationProperties注释,它将不起作用。
或者,您可以以编程方式将任务添加到TaskScheduler. 这样做的好处是你有更多的编译时安全性,它允许你Duration直接使用:
@Bean
public ScheduledFuture<?> schedule(TaskScheduler scheduler, AppProperties properties) {
return scheduler.scheduleWithFixedDelay(() -> log.info("Scheduled"), properties.getDelay());
}
Run Code Online (Sandbox Code Playgroud)
假设您使用的是足够新的 Spring 版本,您可以使用任何可以解析为java.time.Duration. 在你的情况下:
PT10S
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1227 次 |
| 最近记录: |