Springboot整合Schedule 动态新增修改任务cron

说明下,这里是单机版的,真正分布式应该建立定时任务调度中心,直接上代码了

package com.bzl.face.system.schedule;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;

/**
 * 单机版定时任务:futureGroup 定时任务Map集合,key为任务名称
 *               taskGroup 任务集合,key为任务名称,value为具体任务
 * 任务名称不能重复,统一在TaskEnum中枚举
 *
 * @author wuyp
 * @date 2019/10/22 10:15
 */

@Slf4j
@Component
public class ScheduleTask {

    @Autowired
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;

    private Map<String, ScheduledFuture<?>> futureGroup = new HashMap<>(16);
    private Map<String,Runnable> taskGroup = new HashMap<>(16);

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        return new ThreadPoolTaskScheduler();
    }

    
    /**
     * 启动定时任务 (若任务名相同,则覆盖之前的任务)
     **/
    public void startCron(String name, Runnable task, String cron) {
        stopCron(name);
        ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(task, new CronTrigger(cron));
        futureGroup.put(name, future);
        taskGroup.put(name, task);
        log.info(String.format("scheduled task: [%s] start success", name));
    }

    
    /**
     * 停止任务
     **/
    public void stopCron(String name) {
        ScheduledFuture<?> future = futureGroup.get(name);
        if (future != null) {
            future.cancel(true);
            log.info(String.format("scheduled task: [%s] stop success", name));
        }else {
            log.error(String.format("scheduled task: [%s] not exist", name));
        }
    }
    

    /**
     * 变更任务间隔,再次启动 先停止,在开启.
     **/
    public void changeCron(String name, String cron){
        stopCron(name);
        ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(taskGroup.get(name), new CronTrigger(cron));
        futureGroup.put(name, future);
        log.info(String.format("scheduled task: [%s] change success", name));
    }

}

TaskEnum类:

package com.bzl.face.common.enums;

/**
 * 定时任务枚举
 * @author wuyp
 * @date 2019-11-20 20:41
 */
public enum TaskEnum {

    /**
     * 火警通知任务
     */
    FIRE_ALARM("火警通知定时任务");

    private String value;

    TaskEnum(String value) {
        this.value = value;
    }
}

 

使用部分代码:

    @Autowired
    private ScheduleTask scheduleTask;


    @PostMapping(value = {"/jsontest"})
    @ResponseBody
    public ResultBean jsontest(@RequestBody JSONObject json){

        String cron = json.getString("cron");
        scheduleTask.startCron(TaskEnum.FIRE_ALARM.name(), this::fireAlarm, cron);

        return ResultBean.success();
    }

    @PostMapping(value = {"/jsontest2"})
    @ResponseBody
    public ResultBean jsontest2(@RequestBody JSONObject json) throws Exception{

        String cron = json.getString("cron");
        scheduleTask.changeCron(TaskEnum.FIRE_ALARM.name(), cron);

        Thread.sleep(30000);
        scheduleTask.stopCron(TaskEnum.FIRE_ALARM.name());
        return ResultBean.success();
    }

    private void fireAlarm() {
        System.out.println(">>>>>>>>>>>>  任务1执行。。," + DateUtil.now());
    }

测试通过,喜欢的朋友直接用吧,至于异常方面,可以里面去捕获,可以抛出来外面再处理,都可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值