I have a requirement to run a batch job at a fixed interval and have the ability to change the time of this batch job at runtime. For this I came across @Scheduled annotatio
In spring boot, you can use an application property directly!
For example:
@Scheduled(fixedDelayString = "${my.property.fixed.delay.seconds}000")
private void process() {
// your impl here
}
Note that you can also have a default value in case the property isn't defined, eg to have a default of "60" (seconds):
@Scheduled(fixedDelayString = "${my.property.fixed.delay.seconds:60}000")
Other things I discovered:
privateI found being able to use private visibility handy and used it in this way:
@Service
public class MyService {
public void process() {
// do something
}
@Scheduled(fixedDelayString = "${my.poll.fixed.delay.seconds}000")
private void autoProcess() {
process();
}
}
Being private, the scheduled method can be local to your service and not become part of your Service's API.
Also, this approach allows the process() method to return a value, which a @Scheduled method may not. For example, your process() method can look like:
public ProcessResult process() {
// do something and collect information about what was done
return processResult;
}
to provide some information about what happened during processing.