基于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
相关推荐
努力也学不会java10 分钟前
【设计模式】 原型模式
java·设计模式·原型模式
方渐鸿32 分钟前
【2024】k8s集群 图文详细 部署安装使用(两万字)
java·运维·容器·kubernetes·k8s·运维开发·持续部署
学亮编程手记36 分钟前
K8S v1.33 版本主要新特性介绍
java·容器·kubernetes
Haven-2 小时前
Java-面试八股文-JVM篇
java·jvm·面试
我真的是大笨蛋2 小时前
JVM调优总结
java·jvm·数据库·redis·缓存·性能优化·系统架构
wjs0402 小时前
Git常用的命令
java·git·gitlab
superlls2 小时前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法
田里的水稻3 小时前
C++_队列编码实例,从末端添加对象,同时把头部的对象剔除掉,中的队列长度为设置长度NUM_OBJ
java·c++·算法
ponnylv3 小时前
深入剖析Spring Boot启动流程
java·开发语言·spring boot·spring
前行的小黑炭3 小时前
Android 协程的使用:结合一个环境噪音检查功能的例子来玩玩
android·java·kotlin