Springboot 通过ThreadPoolTaskScheduler实现定时任务动态增、删、改、启动、暂停

Springboot 通过Schedule实现定时任务动态增、删、改、启动、暂停

缺点:1、不支持分布式

           2、本人未做界面开发,但是Controller层全部都已经定义好。

由于代码太多,值粘出部分代码,大家可以下载项目源码看看

数据库

CREATE TABLE `schedule_setting` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `job_name` varchar(255) DEFAULT NULL,
  `class_name` varchar(255) DEFAULT NULL,
  `method` varchar(255) DEFAULT NULL,
  `cron` varchar(255) DEFAULT NULL,
  `status` int(2) DEFAULT NULL COMMENT '0 代表开启,1代表关闭',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

Controller层

/**
 * @author : 徐长城
 * @des:
 * @date : 2019/8/21 21:50
 */
@RestController
@RequestMapping("/timmer")
public class TimmerController {

    @Autowired
    private TimmerServiceImpl timmerServiceImpl;

    /**
     * 添加任务
     * @return
     */
    @GetMapping("/add")
    public ReponseData addTask(){
        ReponseData res = new ReponseData();
        try {
            timmerServiceImpl.addTask();
            res.setCode(0);
            res.setMsg("添加成功");
        } catch (Exception e){
            res.setCode(1);
            res.setMsg("添加失败");
        }
        return res;
    }

    /**
     * 修改任务
     * @return
     */
    @GetMapping("/update")
    public ReponseData updateTask(){
        ReponseData res = new ReponseData();
        try {
            timmerServiceImpl.updateTask();
            res.setCode(0);
            res.setMsg("修改成功");
        } catch (Exception e){
            System.out.println(e.toString());
            res.setCode(1);
            res.setMsg("修改失败");
        }
        return res;
    }

    /**
     * 暂停任务
     */
    @GetMapping("/pause")
    public ReponseData pauseTask(){
        ReponseData res = new ReponseData();
        try {
            timmerServiceImpl.pauseTask();
            res.setCode(0);
            res.setMsg("暂停成功");
        } catch (Exception e){
            res.setCode(1);
            res.setMsg("暂停失败");
        }
        return res;
    }

    /**
     * 开启任务
     */
    @GetMapping("/start")
    public ReponseData startTask(){
        ReponseData res = new ReponseData();
        try {
            timmerServiceImpl.startTask();
            res.setCode(0);
            res.setMsg("开启成功");
        } catch (Exception e){
            res.setCode(1);
            res.setMsg("开启失败");
        }
        return res;
    }


    /**
     * 删除任务
     */
    @GetMapping("/del")
    public ReponseData delTask(){
        ReponseData res = new ReponseData();
        try {
            timmerServiceImpl.deleteTask();
            res.setCode(0);
            res.setMsg("删除成功");
        } catch (Exception e){
            res.setCode(1);
            res.setMsg("删除失败");
        }
        return res;
    }
}

定时任务核心

/**
 * @author : 徐长城
 * @des:  定时任务配置
 * @date : 2019/8/21 21:13
 */
@Component
public class TimmerComponent {

    // 保存任务
    private Map<String, ScheduledFuture<?>> futuresMap = new ConcurrentHashMap<String, ScheduledFuture<?>>();

    @Autowired
    private TimmerDao timmerDao;

    // 创建ThreadPoolTaskScheduler线程池
    @Autowired
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;
    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(10);
        return threadPoolTaskScheduler;
    }

    // 初始化任务
    @Bean
    public void initTimmer(){
        List<ScheduleConfig> list = timmerDao.getScheduleList();
        for (ScheduleConfig s : list){
            ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(getRunnable(s), getTrigger(s));
            futuresMap.put(s.getJobName(), future);
        }
    }

    /**
     * 添加任务
     * @param s
     */
    public void addTask(ScheduleConfig s){
        ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(getRunnable(s), getTrigger(s));
        futuresMap.put(s.getJobName(), future);
    }

    /**
     * 暂停任务
     * @param key
     * @return
     */
    public boolean pauseeTask(String key) {
        ScheduledFuture toBeRemovedFuture = futuresMap.remove(key);
        if (toBeRemovedFuture != null) {
            toBeRemovedFuture.cancel(true);
            return true;
        } else {
            return false;
        }
    }

    /**
     * 更新任务
     * @param s
     */
    public void updateTask(ScheduleConfig s) {
        ScheduledFuture toBeRemovedFuture = futuresMap.remove(s.getJobName());
        if (toBeRemovedFuture != null) {
            toBeRemovedFuture.cancel(true);
        }
        addTask(s);
    }


    /**
     * 转换首字母小写
     *
     * @param str
     * @return
     */
    public static String lowerFirstCapse(String str) {
        char[] chars = str.toCharArray();
        chars[0] += 32;
        return String.valueOf(chars);
    }

    /**
     * runnable
     * @param scheduleConfig
     * @return
     */
    private Runnable getRunnable(ScheduleConfig scheduleConfig){
        return new Runnable() {
            @Override
            public void run() {
                Class<?> clazz;
                try {
                    clazz = Class.forName(scheduleConfig.getClassName());
                    String className = lowerFirstCapse(clazz.getSimpleName());
                    Object bean = (Object) ApplicationContextHelper.getBean(className);
                    Method method = ReflectionUtils.findMethod(bean.getClass(), scheduleConfig.getMethod());
                    ReflectionUtils.invokeMethod(method, bean);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        };
    }

    /**
     * Trigger
     * @param scheduleConfig
     * @return
     */
    private Trigger getTrigger(ScheduleConfig scheduleConfig){
        return new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                CronTrigger trigger = new CronTrigger(scheduleConfig.getCron());
                Date nextExec = trigger.nextExecutionTime(triggerContext);
                return nextExec;
            }
        };

    }
}

本人也写了SSM+Quartz实现动态定时任务,地址:

https://blog.csdn.net/xcc_2269861428/article/details/82116718   

 

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值