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();
}
}