动态控制定时任务增删启停

1.启动类增加注解

Application启动类上添加注解@EnableScheduling

2.创建 DynamicScheduledTaskRegistrar 核心类

java 复制代码
@Slf4j
public class DynamicScheduledTaskRegistrar extends ScheduledTaskRegistrar {
    private final Map<String, ScheduledTask> scheduledTaskMap = new LinkedHashMap<>(16);

    public DynamicScheduledTaskRegistrar(){
        super();
        // 两种实现方案
        //ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
        //TaskScheduler taskScheduler = new ConcurrentTaskScheduler(scheduledExecutorService);
        // 第二种实现方案
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(8);
        taskScheduler.setRemoveOnCancelPolicy(true);
        taskScheduler.setThreadNamePrefix("dynamic-scheduled-task-");
        taskScheduler.initialize();
        this.setScheduler(taskScheduler);
    }
    /**
     * 新增任务
     * @param taskName
     * @param cron
     * @param runnable
     */
    public Boolean addCronTask(String taskName,String cron,Runnable runnable){
        if(scheduledTaskMap.containsKey(taskName)){
            log.error("定时任务["+ taskName+"]已存在,添加失败");
            return Boolean.FALSE;
        }
        CronTask cronTask = new CronTask(runnable,cron);
        ScheduledTask scheduledTask = this.scheduleCronTask(cronTask);
        scheduledTaskMap.put(taskName,scheduledTask);
        log.info("定时任务["+taskName+"]新增成功");
        return Boolean.TRUE;
    }

    /**
     * 删除任务
     * @param taskName
     */
    public void cancelCronTask(String taskName){
        ScheduledTask scheduledTask = scheduledTaskMap.get(taskName);
        if(null != scheduledTask){
            scheduledTask.cancel();
            scheduledTaskMap.remove(taskName);
        }
        log.info("定时任务["+taskName+"]删除成功");
    }

    @Override
    public void destroy() {
        super.destroy();
        scheduledTaskMap.values().forEach(ScheduledTask::cancel);
    }
}

测试请求

java 复制代码
@Controller
@RequestMapping("/task/")
public class TaskController {
    @Resource
    public DynamicScheduledTaskRegistrar dynamicScheduledTaskRegistrar;

    @RequestMapping("test")
    @ResponseBody
    public String testTask(){
        String cron ="0/5 * * * * ?";
        String taskName = "test";
        Runnable runnable = this::test;
        dynamicScheduledTaskRegistrar.addCronTask(taskName,cron,runnable);
        return "true";
    }

    public void test(){
        System.out.println("aaa");
    }
}
相关推荐
不会C语言的男孩2 分钟前
C++ Primer 第13章:拷贝控制
开发语言·c++
z落落5 分钟前
C# 静态成员 vs 非静态成员(调用规则+内存特点)+只读和常量 const常量 / readonly / static readonly 三者终极区别
java·开发语言·c#
zhangfeng11337 分钟前
超算中心 高性能计算 slurm的linux版本 centos7,如何安装docker,如何安装torch2.4
linux·运维·服务器·开发语言·人工智能·机器学习·docker
weixin_407443878 分钟前
OCR材料信息提取工具(附件中含代码和数据)
人工智能·python·计算机视觉·ocr
java1234_小锋11 分钟前
LangChain4j 开发Java Agent智能体- 整合SpringBoot4
java·开发语言·langchain4j
码农阿强14 分钟前
PixVerse 全系列视频生成模型技术架构详解 + Python 基于 StartAPI.top 接口实战调用
python·ai·架构·音视频·ai编程
basketball61614 分钟前
C++进阶:3. unique_ptr 现代C++内存管理的基石
java·jvm·c++
我不是懒洋洋18 分钟前
从零实现一个Redis客户端:RESP协议与网络编程
开发语言·c++
zzqssliu20 分钟前
跨境代购系统的物流和通知模块重构思考:从设计模式到生产落地
java·设计模式·重构
Smilecoc23 分钟前
风控评分卡模型原理与应用(四):WOE编码的单调性
python