Spring boot: How to parameterize @Scheduled

Joseph Gagnon :

I am new to Spring and have only scratched the surface of what can be done with it.

I have a situation where I need to set up a recurring task using the @Scheduled annotation. The rate is specified as a member field in an object that is passed to the class encapsulating the method representing the task.

I've used the mechanism that allows for accessing the configuration or environment, e.g. @Scheduled(fixedRateString = "${some.property:default}"); this works great.

What I don't know how to do is insert the value from an object into the @Scheduled.

For example:

class MyClass {
  private MyObject myObj;

  public MyClass(MyObject myObj) {
    this.myObj = myObj;
  }

  @Scheduled(fixedRateString = "${myObj.rate:5000}")
  private void someTask() {
    ...
  }
}

The code above, of course, does not work, I'm just giving an example of what I'm trying to do.

Any suggestions would be appreciated.

Rawb :

Unfortunately the spring bean creation process will not read local variables like that.

You can use the Spring TaskScheduler class.

Essentially you just have to define a thread pool that you will use to run the scheduled tasks (as a bean) and run taskScheduler.schedule(runnable, new CronTrigger("* * * * *")). There is a detailed example here:

https://www.baeldung.com/spring-task-scheduler

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=91270&siteId=1