JavaLessons/spring-custom-scheduler/src/main/java/com/bvn13/example/springcustomscheduler/config/ScheduledTaskManager.java

84 lines
2.7 KiB
Java

package com.bvn13.example.springcustomscheduler.config;
import lombok.Getter;
import lombok.Setter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ScheduledFuture;
import java.util.stream.Collectors;
/** Scheduled tasks manager
* idea: https://dzone.com/articles/schedulers-in-java-and-spring
* @author boyko_vn
* @since 05.08.2019
*/
public class ScheduledTaskManager implements SchedulingConfigurer {
private static final Logger logger = LoggerFactory.getLogger(ScheduledTaskManager.class);
@Getter
@Setter
private int poolSize;
private TaskScheduler taskScheduler;
@Getter
@Setter
private List<ScheduledTask> scheduling;
private ScheduledTaskRegistrar scheduledTaskRegistrar;
/**
* immutable task list
* could be used for managing them
*/
@Getter
private List<ScheduledFuture<?>> tasks;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
this.scheduledTaskRegistrar = scheduledTaskRegistrar;
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(poolSize);// Set the pool of threads
threadPoolTaskScheduler.setThreadNamePrefix("scheduler-thread");
threadPoolTaskScheduler.initialize();
taskScheduler = threadPoolTaskScheduler;
scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
setUpJobs();
}
private void setUpJobs() {
tasks = Collections.unmodifiableList(scheduling.stream()
.map(this::prepareJob)
.collect(Collectors.toList()));
}
private ScheduledFuture<?> prepareJob(ScheduledTask task) {
return taskScheduler.schedule(() -> {
logger.debug("Starting task: "+task.getName());
try {
task.execute();
logger.debug("Done task: "+task.getName());
} catch (Throwable e) {
logger.error("ERROR task: "+task.getName(), e);
}
}, triggerContext -> new CronTrigger(task.getCron()).nextExecutionTime(triggerContext));
}
public void reloadSchedules() {
configureTasks(this.scheduledTaskRegistrar);
}
}