“ Springboot提供了@Scheduled注解来方便我们创建定时任务,可是如果我们需要动态创建定时任务呢?今天我们就一起来看下Springboot如何动态创建定时任务。”
// java14以下,手动将record类转为普通类
public record TestRunnable(String name) implements Runnable {
@Override
public void run() {
System.out.println("定时任务" + name + "执行了");
}
}
public class TestController {
private final ThreadPoolTaskScheduler taskScheduler;
// 用ConcurrentHashMap来存放我们的定时任务集合,方便增删
private final Map<String, ScheduledFuture<?>> scheduledTasks;
public TestController(ThreadPoolTaskScheduler taskScheduler) {
this.taskScheduler = taskScheduler;
scheduledTasks = new ConcurrentHashMap<>(16);
}
"/add") (
public String add( ("name") String name) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.SECOND, 10);
addTask("testTask", new TestRunnable(name), calendar.getTime());
return "success";
}
"/remove") (
public String remove( ("name") String name) {
removeTask(name);
return "success";
}
private void addTask(String taskName, Runnable task, Date startTime) {
if (scheduledTasks.containsKey(taskName)){
removeTask(taskName);
}
ScheduledFuture<?> schedule = taskScheduler.schedule(task, startTime);
scheduledTasks.put(taskName, schedule);
}
private void removeTask(String taskName) {
ScheduledFuture<?> scheduledFuture = scheduledTasks.get(taskName);
scheduledFuture.cancel(true);
scheduledTasks.remove(taskName);
}
}
package org.springframework.scheduling;
import java.time.Clock;
import java.time.Duration;
import java.time.Instant;
import java.util.Date;
import java.util.concurrent.ScheduledFuture;
import org.springframework.lang.Nullable;
// spring调度接口源码
public interface TaskScheduler {
default Clock getClock() {
return Clock.systemDefaultZone();
}
ScheduledFuture<?> schedule(Runnable task, Trigger trigger);
default ScheduledFuture<?> schedule(Runnable task, Instant startTime) {
return this.schedule(task, Date.from(startTime));
}
ScheduledFuture<?> schedule(Runnable task, Date startTime);
default ScheduledFuture<?> scheduleAtFixedRate(Runnable task, Instant startTime, Duration period) {
return this.scheduleAtFixedRate(task, Date.from(startTime), period.toMillis());
}
ScheduledFuture<?> scheduleAtFixedRate(Runnable task, Date startTime, long period);
default ScheduledFuture<?> scheduleAtFixedRate(Runnable task, Duration period) {
return this.scheduleAtFixedRate(task, period.toMillis());
}
ScheduledFuture<?> scheduleAtFixedRate(Runnable task, long period);
default ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, Instant startTime, Duration delay) {
return this.scheduleWithFixedDelay(task, Date.from(startTime), delay.toMillis());
}
ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, Date startTime, long delay);
default ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, Duration delay) {
return this.scheduleWithFixedDelay(task, delay.toMillis());
}
ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, long delay);
}