zoukankan      html  css  js  c++  java
  • 【记录】【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保证其唯一性

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

  • 相关阅读:
    排序sort (一)
    c++实现二叉树笔记(模板实现)(三)
    树(二叉树)的建立和遍历算法(二)
    IO流之字节流
    计算机基础知识
    计算机启动过程
    2020软考报名计划表
    2020软件工程作业02
    初来乍到 20200904
    关于考研
  • 原文地址:https://www.cnblogs.com/xiaostudy/p/11664464.html
Copyright © 2011-2022 走看看