基于Springboot的运行时动态可调的定时任务

配置类

java 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

@Configuration
public class TaskSchedulerConfig {
    @Bean(destroyMethod = "shutdown")
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(自定义池大小,可以通过配置指定大小);
        scheduler.initialize();
        return scheduler;
    }
}

创建和删除定时任务的接口示例

java 复制代码
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;

@Slf4j
@RestController
@RequestMapping("/task")
public class InnerCommonController {

	@GetMapping("/c")
	public ResponseEntity<?> create(@RequestParam("cron") String cron,
	                                    @RequestParam("taskId") String taskId) {
	    Runnable task = () -> {
	        System.out.println("Executing task: " + taskId + LocalDateTime.now());
	        // 执行任务的具体逻辑
	    };
	    CronTrigger trigger = new CronTrigger(cron);
	    ScheduledFuture<?> future = taskScheduler.schedule(task, trigger);
	    scheduledTasks.put(taskId, future);
	    return ResponseEntity.ok().build();
	}
	
	@GetMapping("/d")
	public ResponseEntity<?> delete(@RequestParam("taskId") String taskId) {
	    ScheduledFuture<?> future = scheduledTasks.remove(taskId);
	    if (future != null) {
	        future.cancel(false); // 取消任务
	        return ResponseEntity.ok().build();
	    } else {
	        return ResponseEntity.notFound().build();
	    }
	}
}

调用示例

新增,cron表达式encode了,3秒一次

http://127.0.0.1:8080/demo/task/c?cron=0/3 \* \* \* \* ? \&taskId=2024

删除

http://127.0.0.1:8080/demo/task/task/d?taskId=2024

创建后日志打印结果

java 复制代码
Executing task: 20242024-08-05T13:50:03.013
Executing task: 20242024-08-05T13:50:06.014
Executing task: 20242024-08-05T13:50:09.003
Executing task: 20242024-08-05T13:50:12.011
Executing task: 20242024-08-05T13:50:15.012
Executing task: 20242024-08-05T13:50:18.007
相关推荐
程序员岳焱39 分钟前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
FrankYoou43 分钟前
Jenkins 与 GitLab CI/CD 的核心对比
java·docker
麦兜*1 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
KK溜了溜了1 小时前
JAVA-springboot 整合Redis
java·spring boot·redis
大只鹅2 小时前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch
ai小鬼头2 小时前
AIStarter如何快速部署Stable Diffusion?**新手也能轻松上手的AI绘图
前端·后端·github
天河归来2 小时前
使用idea创建springboot单体项目
java·spring boot·intellij-idea
weixin_478689762 小时前
十大排序算法汇总
java·算法·排序算法
码荼2 小时前
学习开发之hashmap
java·python·学习·哈希算法·个人开发·小白学开发·不花钱不花时间crud
IT_10242 小时前
Spring Boot项目开发实战销售管理系统——数据库设计!
java·开发语言·数据库·spring boot·后端·oracle