0

I am using this solution for changing in runtime cron expression of spring scheduler: Spring Scheduler change cron expression dynamically

It works fine but when I try to check scheduled jobs using spring actuator then it shows empty list: {"cron":[],"fixedDelay":[],"fixedRate":[],"custom":[]}

Works only with tasks scheduled with @Scheduled annotation. Is there a way to make it working also with such task scheduled by hand? I am using Spring 5.3.20.

Adam
  • 17
  • 3

1 Answers1

1

Finally found a solution with using ScheduledTaskRegistrar and implementing of ScheduledTaskHolder:

public class SchedulerDynamic implements Runnable, ScheduledTaskHolder {

@SuppressWarnings("rawtypes")
private TaskScheduler taskScheduler;
private ScheduledTask scheduledTask;
private ScheduledTaskRegistrar scheduledTaskRegistrar;

@NotNull
@Override
public Set<ScheduledTask> getScheduledTasks() {
    return Set.of(scheduledTask);
}

//this method will kill previous scheduler if exists and will create a new scheduler with new cron expression
public void reSchedule() {
    String cronStr = "..."; // get new cron expression
    if (this.scheduledTask != null) {
        this.scheduledTask.cancel(true);
    }
    if (taskScheduler == null) {
        this.taskScheduler = new ConcurrentTaskScheduler();
    }
    if (scheduledTaskRegistrar == null) {
        this.scheduledTaskRegistrar = new ScheduledTaskRegistrar();
    }
    scheduledTaskRegistrar.setTaskScheduler(taskScheduler);
    this.scheduledTask = scheduledTaskRegistrar.scheduleCronTask(new CronTask(this, new CronTrigger(cronStr)));
}

@Override
public void run() {
    // task to be performed
}

@PostConstruct
private void initializeScheduler() {
    this.reSchedule();
}

}

Adam
  • 17
  • 3