- 定义定时任务接口
public interface ScheduledTask {
/**
* 执行定时任务
*/
void executeTask();
/**
* 获取任务名称
*/
String getTaskName();
/**
* 获取cron表达式
*/
String getCronExpression();
/**
* 是否启用
*/
boolean isEnabled();
}
- 实现定时任务接口
@Component
public class MyScheduledTask implements ScheduledTask {
@Override
@Scheduled(cron = "${my.task.cron}")
public void executeTask() {
// 执行定时任务的逻辑
}
@Override
public String getTaskName() {
return "myTask";
}
@Override
public String getCronExpression() {
return "0 0 0 * * ?";
}
@Override
public boolean isEnabled() {
return true;
}
}
在@Scheduled注解中使用${}表达式,可以从配置文件中读取cron表达式
- 定义定时任务管理器
@Component
public class ScheduledTaskManager {
@Autowired
private List<ScheduledTask> scheduledTasks;
@Autowired
private ThreadPoolTaskScheduler taskScheduler;
private Map<String, ScheduledFuture<?>> scheduledFutures = new ConcurrentHashMap<>();
/**
* 启动所有定时任务
*/
@PostConstruct
public void startAllTasks() {
for (ScheduledTask task : scheduledTasks) {
if (task.isEnabled()) {
ScheduledFuture<?> scheduledFuture = taskScheduler.schedule(task::executeTask, new CronTrigger(task.getCronExpression()));
scheduledFutures.put(task.getTaskName(), scheduledFuture);
}
}
}
/**
* 启动指定定时任务
*/
public void startTask(String taskName) {
ScheduledTask task = getTaskByName(taskName);
if (task != null && !scheduledFutures.containsKey(taskName)) {
ScheduledFuture<?> scheduledFuture = taskScheduler.schedule(task::executeTask, new CronTrigger(task.getCronExpression()));
scheduledFutures.put(taskName, scheduledFuture);
}
}
/**
* 停止指定定时任务
*/
public void stopTask(String taskName) {
ScheduledFuture<?> scheduledFuture = scheduledFutures.get(taskName);
if (scheduledFuture != null) {
scheduledFuture.cancel(true);
scheduledFutures.remove(taskName);
}
}
/**
* 根据任务名称获取定时任务
*/
private ScheduledTask getTaskByName(String taskName) {
for (ScheduledTask task : scheduledTasks) {
if (task.getTaskName().equals(taskName)) {
return task;
}
}
return null;
}
}
在ScheduledTaskManager中,通过注入所有实现了ScheduledTask接口的Bean,并根据isEnabled()方法来判断是否启用该定时任务。在启动定时任务时,使用taskScheduler.schedule()方法来添加定时任务,并将返回的ScheduledFuture对象保存在scheduledFutures中。在停止定时任务时,通过ScheduledFuture.cancel()方法来停止。