【記錄】【springboot】動態定時任務ScheduledFuture,可添加、修改、刪除


 

這里只演示添加和刪除任務的,因為修改就是刪除任務再添加而已。

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

 

1、沒有任務

 

 后台

 

 

2、添加一個任務

 

 

 

 

 

 

3、再添加一個任務

 

 

 

 

 

 

4、刪除一個任務

 

 

 

 

 

 

5、再添加一個任務

 

 

 

 

 

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保證其唯一性

小白剛剛接觸,只有簡單的實現,沒有考慮數據量大等問題。僅做記錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM