这里只演示添加和删除任务的,因为修改就是删除任务再添加而已。
方便演示,任务就是每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保证其唯一性
小白刚刚接触,只有简单的实现,没有考虑数据量大等问题。仅做记录
原文地址:https://www.cnblogs.com/xiaostudy/p/11664464.html
时间: 2024-10-09 17:34:36