基于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
相关推荐
Yan.love4 分钟前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶7 分钟前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥7 分钟前
java提高正则处理效率
java·开发语言
小_太_阳29 分钟前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
智慧老师38 分钟前
Spring基础分析13-Spring Security框架
java·后端·spring
lxyzcm39 分钟前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
V+zmm101341 小时前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
Oneforlove_twoforjob2 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
xmh-sxh-13142 小时前
常用的缓存技术都有哪些
java
搬码后生仔2 小时前
asp.net core webapi项目中 在生产环境中 进不去swagger
chrome·后端·asp.net