Есть ли способ использовать @Scheduled вместе со строкой Duration, как 15 с и 5 мес? - PullRequest
1 голос
/ 17 января 2020

У меня есть следующая аннотация в моем коде

@Scheduled(fixedDelayString = "${app.delay}")

В этом случае у меня должны быть свойства, подобные этому

app.delay=10000 #10 sec

Файл правильности выглядит нечитаемым, потому что я вычисляю значение в миллисекундах.

Есть ли способ передать значение, например, 5 м или 30 с?

Ответы [ 3 ]

1 голос
/ 17 января 2020

Насколько я знаю, вы не можете сделать это напрямую. Однако свойства конфигурации загрузки Spring поддерживают автоматическое c преобразование таких параметров, как 15s и 5m в Duration.

Это означает, что вы можете создать класс @ConfigurationProperties например:

@Component
@ConfigurationProperties("app")
public class AppProperties {
    private Duration delay;

    // Setter + Getter
}

Кроме того, поскольку вы можете использовать ссылки на bean-компоненты с языком выражений Spring в аннотации @Scheduled, вы можете сделать что-то вроде этого:

@Scheduled(fixedDelayString = "#{@appProperties.getDelay().toMillis()}")
public void schedule() {
    log.info("Scheduled");
}

Кроме того, вы можете программно добавить задачу к TaskScheduler. Преимущество этого в том, что у вас больше безопасности во время компиляции, и это позволяет вам работать с Duration напрямую:

@Bean
public ScheduledFuture<?> schedule(TaskScheduler scheduler, AppProperties properties) {
    return scheduler.scheduleWithFixedDelay(() -> log.info("Scheduled"), properties.getDelay());
}
1 голос
/ 17 января 2020

Вы можете просто настроить аннотацию для использования умножения SpEL.

@Scheduled(fixedDelayString = "#{${app.delay} * 1000}")
0 голосов
/ 17 января 2020

Предполагая, что вы используете достаточно свежую версию Spring, вы можете использовать любую строку, которая может быть проанализирована до java.time.Duration. В вашем случае:

PT10S
...