【记录】【springboot】动态定时任务ScheduledFuture,可添加、修改、删除

这里只演示添加和删除任务的,因为修改就是删除任务再添加而已。

方便演示,任务就是每3秒打印

1、没有任务

【记录】【springboot】动态定时任务ScheduledFuture,可添加、修改、删除

 后台

【记录】【springboot】动态定时任务ScheduledFuture,可添加、修改、删除

2、添加一个任务

【记录】【springboot】动态定时任务ScheduledFuture,可添加、修改、删除

 【记录】【springboot】动态定时任务ScheduledFuture,可添加、修改、删除

 【记录】【springboot】动态定时任务ScheduledFuture,可添加、修改、删除

3、再添加一个任务

【记录】【springboot】动态定时任务ScheduledFuture,可添加、修改、删除

 【记录】【springboot】动态定时任务ScheduledFuture,可添加、修改、删除

 【记录】【springboot】动态定时任务ScheduledFuture,可添加、修改、删除

4、删除一个任务

【记录】【springboot】动态定时任务ScheduledFuture,可添加、修改、删除

 【记录】【springboot】动态定时任务ScheduledFuture,可添加、修改、删除

 【记录】【springboot】动态定时任务ScheduledFuture,可添加、修改、删除

5、再添加一个任务

【记录】【springboot】动态定时任务ScheduledFuture,可添加、修改、删除

 【记录】【springboot】动态定时任务ScheduledFuture,可添加、修改、删除

6、代码

运行任务线程的代码TaskRunnable.java

import com.xiaostudy.shiro_test1.utils.DateUtils;

public class TaskRunnable implements Runnable  {
    private String name;
    public TaskRunnable(String name) {
        this.name = name;
    }
    @Override
    public void run() {
        System.out.println(name + "---动态定时任务运行---" + DateUtils.getDateTime());
    }
}

TaskController.java

 1 import com.xiaostudy.shiro_test1.task.TaskRunnable;
 2 import org.springframework.beans.factory.annotation.Autowired;
 3 import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
 4 import org.springframework.scheduling.support.CronTrigger;
 5 import org.springframework.stereotype.Controller;
 6 import org.springframework.web.bind.annotation.RequestMapping;
 7 import org.springframework.web.bind.annotation.ResponseBody;
 8 
 9 import java.util.HashMap;
10 import java.util.Map;
11 import java.util.concurrent.ScheduledFuture;
12 import java.util.stream.Collectors;
13 
14 @Controller
15 @RequestMapping("/task")
16 public class TaskController {
17 
18     private Map<String, ScheduledFuture<?>> taskMap = new HashMap<>();
19 
20     @Autowired
21     private ThreadPoolTaskScheduler threadPoolTaskScheduler;
22 
23     @RequestMapping("addTask")
24     @ResponseBody
25     public boolean addTask(String name){
26         String zhangsanCron = "*/3 * * * * ?";
27         return add(name, zhangsanCron);
28     }
29 
30     @RequestMapping("stopTask")
31     @ResponseBody
32     public boolean stopTask(String name){
33         return stop(name);
34     }
35 
36     @RequestMapping("listTask")
37     @ResponseBody
38     public String listTask(){
39         return taskMap.keySet().stream().map(name -> name).collect(Collectors.joining(","));
40     }
41 
42     private boolean add(String name, String cron) {
43         if(null != taskMap.get(name)) {
44             return false;
45         }
46         ScheduledFuture<?> schedule = threadPoolTaskScheduler.schedule(new TaskRunnable(name), new CronTrigger(cron));
47         taskMap.put(name, schedule);
48         return true;
49     }
50 
51     private boolean stop(String name) {
52         if(null == taskMap.get(name)) {
53             return false;
54         }
55         ScheduledFuture<?> scheduledFuture = taskMap.get(name);
56         scheduledFuture.cancel(true);
57         taskMap.remove(name);
58         return true;
59     }
60 }

7、讲解

开始定时任务就是ScheduledFuture<?> schedule = threadPoolTaskScheduler.schedule(new TaskRunnable(name), new CronTrigger(cron));

cron任务调度,比如*/3 * * * * ?表示每3秒执行任务

new TaskRunnable(name)就是实现Runnable的线程,任务处理在run()

ScheduledFuture<?>可以理解就是一个定时任务

任务保存在数据库,当应用开启后立刻查看所有任务,用Map<String, ScheduledFuture<?>>装起来,key可以用id保证其唯一性

小白刚刚接触,只有简单的实现,没有考虑数据量大等问题。仅做记录