有没有办法将@Scheduled 与像 15s 和 5m 这样的 Duration 字符串一起使用?

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 之类的值?

g00*_*00b 9

据我所知,你不能直接做到这一点。然而,春天启动配置性能做支持自动转换的参数等15s,并5mDuration

这意味着你可以创建一个@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)


JB *_*zet 5

假设您使用的是足够新的 Spring 版本,您可以使用任何可以解析为java.time.Duration. 在你的情况下:

PT10S
Run Code Online (Sandbox Code Playgroud)

  • 是的,它有效。但不幸的是 **10s** 不起作用,尽管 spring 能够将 **10s** 解析为 Duration (4认同)