這里只演示添加和刪除任務的,因為修改就是刪除任務再添加而已。
方便演示,任務就是每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保證其唯一性
小白剛剛接觸,只有簡單的實現,沒有考慮數據量大等問題。僅做記錄
