How to change Spring's @Scheduled fixedDelay at runtime

前端 未结 5 1886
予麋鹿
予麋鹿 2020-11-30 03:00

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

5条回答
  •  借酒劲吻你
    2020-11-30 03:43

    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:

    • the method must be void
    • the method must have no parameters
    • the method may be private

    I 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.

提交回复
热议问题