从零搭建开发脚手架 基于Spring Task实现动态管理任务

系统运维2025-11-05 05:56:2179473

本文转载自微信公众号「Java大厂面试官」,从零作者laker。搭建转载本文请联系Java大厂面试官公众号。脚手架基

什么是现动定时任务

定时任务是指调度程序在指定的时间或周期触发执行的任务,常用场景如下:

定时发短信 定时变更数据 定时统计数据 定时修改状态 定时开始活动等

常见几种JAVA实现方式

Timer

简介:Timer 是态管 Jdk自带的定时任务执行类,无论任何项目都可以直接使用 Timer 来实现定时任务,理任所以 Timer 的从零优点就是使用方便。

原理:

调度器:单线程。搭建 任务存储:最小堆实现任务存储。脚手架基

优点:Jdk自带类,现动无需引入其他Jar,态管简单易用。理任

缺点:Timer中的从零多个任务只能使用一个线程去执行,因此任务之间的搭建执行情况会相互影响。

当一个任务的脚手架基执行时间过长时,会影响其他任务的调度任务异常影响其他任务。 当一个任务抛出异常,其他任务也会终止运行.

结论:基本无人使用。

ScheduledExecutorService

简介:ScheduledExecutorService 是JDK里面自定义的几种线程池中的一种,高防服务器支持多线程并发的去执行多个调度任务,弥补了Timer的缺陷。

原理:

调度器:多线程。 任务存储:最小堆实现任务存储。

优点:Timer能做到的事情ScheduledExecutorService都能做到,且完美的解决上面所说的Timer存在的两个问题。

缺点:只支持固定速率(fixed-rate)或固定延迟(fixed-delay)的调度任务,不灵活。

结论:常用于框架内部定时任务。

Spring Task

描述:Spring Framework 自带的定时任务。

优点:同ScheduledExecutorService,同时增加了支持cron表达式,可以配置任意基于时钟的调度任务。

缺点:

不支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务。 不支持在线监控执行的任务。

原理:ScheduledExecutorService的扩展。

结论:常用于中小型企业,作为单机定时任务使用。

以上都是单机版本。免费信息发布网

其他分布式定时任务诸如:quartz、xxl-job、elastic-job等等,功能、性能都很强劲,这里不作为研究对象,详情参考:

Java定时任务框架对比 定时任务实现原理 最小堆 时间轮

上面的这些框架都不是我想选择的,要想自由的掌控雷电,那就自己造个简易轮子,满足90%需求即可。

期望实现如下特性:

轻量、轻量、轻量。 支持在线监控执行的任务。 支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务。 支持在线配置调度任务入参和。 支持集群环境扩展(可选)。

收集了半天信息,直接使用Spring Task就可以实现,仅依赖Spring Boot。

Spring Task详解

初级静态配置任务

代码示例:

@Component  @EnableScheduling // 开启定时任务 public class DemoApplication {  // 添加定时任务     @Scheduled(cron = "0/5 * * * * *") // cron 表达式,每5秒执行     public void doTask(){         System.out.println("我是定时任务~");     } } 

无法动态修改任务状态、暂停/恢复任务,以及终止运行中任务。

进阶动态配置任务

实现设计

关键技术点和坑

Spring Task的网站模板调度器默认是线程数为1的ThreadPoolTaskScheduler,自动装配类为TaskSchedulingAutoConfiguration,多任务之间的执行会相互影响,一定要修改默认值。 通过TaskScheduler接口,可以扩展实现动态修改任务状态、暂停/恢复任务,以及终止运行中任务。 TaskScheuler是在Spring 3.0中引入的,有多种方法可以在将来的某个时刻运行,它还返回ScheduledFuture接口的对象,可用于取消计划的任务或检查任务是否完成。 cron-utils一个Java库,用于解析,验证Cron表达式,可以去GitHub查看详细说明。

实现设计

定义IJob接口,用于客户端描述任务

public interface IJob {     void execute(JobContext map) throws JobException; } 

定义注解,用于配合IJob接口定义任务

@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Job {     @AliasFor(annotation = Component.class)     String value() default "";     /**      * cron 表达式默认不"-"代表不执行      */     String cron() default "-";     /**      * 任务编码 必须唯一      */     String taskCode();     /**      * 任务名称      */     String taskName(); } 

定义运行任务状态

public class Task{     /**      * 任务的编码 必须全局唯一      */     private String taskCode;     /**      * 任务的名称      */     private String taskName;     /**      * 任务的类名称      */     private String taskClassName;     /**      * 任务的cron表达式      */     private String taskCron;     @JsonIgnore     private ScheduledFuture scheduledFuture;     @JsonIgnore     private IJob job;     private TaskStateEnum taskState; 

定义任务存储接口,用于存储在缓存或者DB中

public interface ITaskStore {     void saveTask(Task task);     List<Task> list();     Task updateTaskByTaskCode(String taskCron, String taskName, String taskCode);     Task updateTaskStateByTaskCode(TaskStateEnum taskState, String taskCode);     void deleteTaskByTaskCode(String taskCode);     Task findByTaskCode(String taskCode); } 

定义任务锁接口,解决并发问题,以及扩展支持集群环境

public interface ILockService {     void lock(String taskCode);     void unlock(String taskCode); }     

定义事件监听器,用于监听任务的状态事件,可扩展状态监控,各种回调等

public interface IEventListener {     void listener(Event event); } 

核心处理器,处理核心流程

初始化加载所有IJob的实现 从Spring容器获取IJob实现类并解析Job注解 添加任务threadPoolTaskScheduler.schedule(task,cron) 更新任务详情 scheduledFuture.cancel(true) threadPoolTaskScheduler.schedule(task,cron) 启动任务 threadPoolTaskScheduler.schedule(task,cron) 暂停任务 scheduledFuture.cancel(true) 任务监控 TaskList

待实现功能

重试补偿:失败重试。 failstore : 存储失败任务,供人肉补偿。 misfire:存储错过的任务,供人肉补偿。

自己在核心处理器中加下相应的增强功能逻辑即可。

使用示例

直接实现IJob接口并加上Job注解即可

@Job(taskCode = "job1", taskName = "laker测试任务",cron = "0/5 * * * * *") @Slf4j public class TestJob implements IJob {     @Override     public void execute(Map map) throws Exception {         log.info("laker job run");         TimeUnit.SECONDS.sleep(10);     } } 

全部代码:https://gitee.com/lakernote/lakernote

参考:https://juejin.cn/post/6844904002606350343

SpringBoot官网

本文地址:http://www.bhae.cn/html/970f21498815.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

全站热门

电脑时钟错误导致无法上网的解决方法(解决电脑时钟错误,顺利上网畅享互联网世界)

员工争相开发定制AI应用 对安全风险无所顾忌

云上的DevOps人为什么会崩溃?

网络安全职业的五大残酷真相及应对之道

电脑主板刷机教程(电脑主板刷机步骤详解,让你轻松升级BIOS)

垂直定位在公共安全物联网中的应用

让运维智能高效,轻松搞定运维管理平台

AI如何重塑供应商风险管理策略

友情链接

滇ICP备2023000592号-9