当前位置: 首页 > news >正文

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

配置类

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;}
}

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

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%20*%20*%20*%20*%20?%20&taskId=2024
删除
http://127.0.0.1:8080/demo/task/task/d?taskId=2024

创建后日志打印结果

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Java数据结构】---泛型
  • JVM类加载中的双亲委派机制
  • 智能闹钟能改善睡眠质量吗
  • vue使用响应式API和页面组件ref相同名称问题
  • mysql操作(进阶)
  • 第十二章 元数据管理10分
  • 【C语言】数组与指针常见笔试题讲解(1)
  • MySQL 5.7使用 GTID 和 Binlog高可用方案
  • Nginx 常用配置
  • ctfshow-web入门-sql注入(web186-web190)
  • python后端 启用 gzip 压缩响应体
  • 虚拟DOM、Vue渲染流程
  • Python3 爬虫 数据抓包
  • 【深入剖析】Spring依赖注入的最佳实践(@Autowired的正确用法)
  • 【RabbitMQ】直连交换机_扇形交换机_主题交换机
  • 自己简单写的 事件订阅机制
  • [Vue CLI 3] 配置解析之 css.extract
  • CentOS 7 修改主机名
  • css的样式优先级
  • CSS魔法堂:Absolute Positioning就这个样
  • ECS应用管理最佳实践
  • ES6之路之模块详解
  • Java-详解HashMap
  • Js基础知识(一) - 变量
  • Laravel5.4 Queues队列学习
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 想写好前端,先练好内功
  • 最简单的无缝轮播
  • Java数据解析之JSON
  • 湖北分布式智能数据采集方法有哪些?
  • ​Java并发新构件之Exchanger
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • !$boo在php中什么意思,php前戏
  • #if #elif #endif
  • #pragma pack(1)
  • (1)(1.11) SiK Radio v2(一)
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (C语言)fgets与fputs函数详解
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (笔试题)合法字符串
  • (二十四)Flask之flask-session组件
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (算法)求1到1亿间的质数或素数
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (自用)仿写程序
  • *上位机的定义
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .java 9 找不到符号_java找不到符号
  • .NET 4.0中的泛型协变和反变
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .NET构架之我见