Во-первых, моя ситуация: у меня есть список задач, хранящихся в БД, которые нужно запускать с помощью cron (например, задача 1 в 8:00, задача 2 в 10:00 каждый день и т. Д. c). Мне нужно выполнять операции CRUD поверх эти задачи.
Я следовал этой статье http://mbcoder.com/dynamic-task-scheduling-with-spring/.
Так что моя идея состоит в том, что при запуске я загружу все задачи в TaskScheduler и сохраню их в некоторой переменной в моем приложении вот так:
private List<ScheduledFuture> futures = new ArrayList<>();
public void addAll() {
List<Task> taskList = taskRepository.findAll();
for (Task task : taskList) {
// TaskRunnable is class which implements Runnable interface and extends Task class
TaskRunnable tr = new TaskRunnable(task, taskUnitRepository.findAllByTaskId(task.getId()));
futures.add(taskScheduler.schedule(tr, new CronTrigger(tr.getCron())));
}
}
до сих пор все работает нормально
проблема в том, что я не знаю, как отменить выполнение задачи
я пытался что-то вроде этого, но это не работает:
public void deleteOne(Long taskId) throws ExecutionException, InterruptedException {
for (ScheduledFuture sf : futures) {
// sf.get() is not returning TaskRunnable
TaskRunnable taskRunnable = (TaskRunnable) sf.get();
if (taskRunnable.getId().equals(id)) {
sf.cancel(true);
}
}
}
Я не могу получить объект, который должен быть выполнен из экземпляра ScheduledFuture. Поэтому я не могу отменить задачу по параметру taskId.