基于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
相关推荐
happymaker06261 分钟前
Spring学习日记——DAY04(复杂对象创建,AOP静态代理)
java·开发语言·spring
小江的记录本3 分钟前
【MySQL】《MySQL日志面试背诵版+思维导图》(核心考点 + MySQL 8.0最新优化)
java·数据库·后端·python·sql·mysql·面试
我命由我1234511 分钟前
Android Framework P2 - 开机启动 Zygote 进程、Zygote 的预加载机制
android·java·开发语言·python·java-ee·intellij-idea·zygote
JAVA面经实录91714 分钟前
Java Codex 企业标准Prompt库
java·开发语言·prompt
摇曳的精灵17 分钟前
直接关掉jar包,会影响没有执行完的任务吗
java·jar
yoyo_zzm19 分钟前
PHP vs Java:后端语言终极选择指南
java·spring boot·后端·架构·php
m0_5027249520 分钟前
golang 、java、c++、javascript 语言switch case异同
java·javascript·c++·golang
苏三说技术32 分钟前
从索引失效到性能翻倍,DBA不愿透露的10个优化技巧
后端
Season45037 分钟前
C++11并发支持库(condition_variable | future全家桶)
java·jvm·c++
阿Y加油吧44 分钟前
二刷 LeetCode:爬楼梯与杨辉三角,Java 实现复盘
java·算法·leetcode