Spring动态定时任务
# 思路
动态定时任务要求,可以动态的增加、删除、开始、结束定时任务;所以使用注解的方式是一定不行的。
这里需要使用 ThreadPoolTaskScheduler 定时线程池; 任务以Runnable 的形式加载。
Runnable可以多种形式加载,这里使用适用性最好的cron表达式作为定时规则。
# 代码实现
1、任务执行
这里简化代码,体现主体思路:
public Response start(Long taskId) {
try {
Task task = schedulerTaskMapper.findById(taskId);
//获取并实例化Runnable任务类
TaskRunnable taskRunnable = taskRunnableMapper.findById(task.getRunnableId());
Class<?> clazz = Class.forName(taskRunnable.getClasspath());
Taskable runnable = (Taskable)clazz.newInstance();
//Cron表达式
CronTrigger cron = new CronTrigger(task.getExpr());
//执行,并put到runTasks
TaskSchedulerServiceImpl.runTasks.put(
taskId, Objects.requireNonNull(this.threadPoolTaskScheduler.schedule(runnable, cron)));
task.setStatus(new Long(1));
schedulerTaskMapper.update(task);
return Response.buildSuccess();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
return Response.buildFailure("400", "任务启动失败");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2、停止任务
public Response stop(Long taskId) {
if (!TaskSchedulerServiceImpl.runTasks.containsKey(taskId)) {
return Response.buildSuccess();
}
TaskSchedulerServiceImpl.runTasks.get(taskId).cancel(true);
TaskSchedulerServiceImpl.runTasks.remove(taskId);
Task task = schedulerTaskMapper.findById(taskId);
task.setStatus(new Long(0));
schedulerTaskMapper.update(task);
return Response.buildSuccess();
}
2
3
4
5
6
7
8
9
10
11
3、保存任务
public Response save(TaskDTO taskDTO) {
Task task = new Task();
BeanUtils.copyProperties(taskDTO, task);
if ((null == task.getId()) || (null == schedulerTaskMapper.findById(task.getId()))) {
task.setId(null);
schedulerTaskMapper.add(task);
} else {
this.stop(task.getId());
schedulerTaskMapper.update(task);
}
return Response.buildSuccess();
}
2
3
4
5
6
7
8
9
10
11
12
4、删除任务
public Response delete(Long taskId) {
this.stop(taskId);
schedulerTaskMapper.delete(taskId);
return Response.buildSuccess();
}
2
3
4
5
仓库位置:https://github.com/su-dd/demo.git (opens new window)
代码位置:Spring相关/40Demo (opens new window)
# API介绍
ThreadPoolTaskScheduler有多种方式执行Runnable:
schedule(Runnable task, Date stateTime),在指定时间执行一次定时任务
schedule(Runnable task, Trigger trigger),动态创建指定表达式cron的定时任务
scheduleAtFixedRate(Runnable task, Date startTime, long period),从指定的时间开始以指定间隔时间(以毫秒为单位)执行一次任务,间隔时间为前一次执行开始到下一次任务开始时间
scheduleAtFixedRate(Runnable task, long period),从现在开始以指定间隔时间(以毫秒为单位)执行一次任务,间隔时间为前一次执行开始到下一次任务开始时间
scheduleWithFixedDelay(Runnable task, Date startTime, long delay),从指定的时间开始以指定间隔时间(以毫秒为单位)执行一次任务,间隔时间为前一次执行完成到下一次任务开始时间
scheduleWithFixedDelay(Runnable task, Duration delay),从现在开始以指定间隔时间(以毫秒为单位)执行一次任务,间隔时间为前一次执行完成到下一次任务开始时间