7

The @Scheduled documentation here states that the fixedRateString value can be the delay in milliseconds as a String value, e.g. a placeholder or a java.time.Duration compliant value. Meaning I can either write

@Scheduled(fixedRateString = "45s")

OR

@Scheduled(fixedRateString = "45000")

And it should be the same. However when I try to run it I get

Encountered invalid @Scheduled method 'updateWarmupInstances': Invalid fixedRateString value "45s" - cannot parse into long

So it this a mistake on Spring's part or am I doing something wrong ?

Ben
  • 3,989
  • 9
  • 48
  • 84
  • FYI an issue was opened recently requesting flexible duration parsing of the kind you and I both expected. Turns out it's a Spring framework issue, not Spring Boot: github.com/spring-projects/spring-framework/issues/22013 – Bampfer Mar 15 '19 at 14:41

2 Answers2

11

To use the method @Scheduled(fixedRateString) for durations, you could use a String with the standard duration:

@Scheduled(fixedRateString = "PT45S")

The prefix PT is for ISO-8601 standard and in this example, it's mean the duration of 45 seconds.

Another example could be a duration of 1h:

@Scheduled(fixedRateString = "PT1H")
Bruno Morais
  • 1,029
  • 11
  • 12
4

You are looking at the return value of the method, not the input. The input can only be a String in milliseconds, but the return value is a value compliant with Duration.

Erik Pragt
  • 13,513
  • 11
  • 58
  • 64
  • 3
    Return value of… what method? The `fixedRateString` attribute of the annotation? Or are you suggesting that the annotated method can return either a String or Duration to describe the frequency with which it will be called? – VGR Mar 04 '21 at 20:23