轻量级 Spring Task 任务调度可视化管理

Spring Task/Spring Scheduler 傻傻分不清

首先做一下"名词解释",分清楚这两者的区别:

Spring Task

  • Spring Task 是 Spring 框架自带的一个任务调度模块,提供了基本的任务调度功能。
  • 它是通过 Java 的 Timer 和 TimerTask 类来实现的,这两个类提供了一种简单的方式来安排和执行重复性任务。
  • Spring Task 可以通过@Scheduled注解将方法标记为定时任务,并指定任务的触发条件、执行时间间隔等属性。
  • Spring Task 适用于简单的定时任务和重复性任务,但在处理复杂任务、并发任务或需要更高级功能的场景下有限。

Spring Scheduler

Spring Scheduler 也称为 Spring Scheduling。

  • Spring Scheduling 是 Spring 框架对任务调度的一种增强支持,建立在 Spring Task 基础上。
  • 它使用了一个更强大、灵活且可扩展的任务调度器接口,例如TaskSchedulerThreadPoolTaskScheduler
  • Spring Scheduling 提供了比 Spring Task 更多的特性和配置选项,如异步执行任务、并发控制、任务取消和动态调度等。
  • 它还提供了更多的任务触发选项和灵活的表达式语法,例如 Cron 表达式。

总结起来,Spring Task 是 Spring 框架自带的一个简单任务调度模块,提供了基本的定时任务功能;而 Spring Scheduling 是对任务调度的增强支持,提供了更多特性和配置选项,适用于更复杂的任务调度需求。如果您只需要简单的定时任务,可以使用 Spring Task;如果需要更丰富的任务调度功能,可以选择 Spring Scheduling。

本组件简介

大家都知道 Spring Scheduler 好用和怎么用,但它没有一个像 XXL-Job 有个后台界面的,好像不太完整,于是笔者打算为 Spring Scheduler 提供一个可视化的操作界面,虽然赶不上 XXL-Job 那么强大,但也算弥补其中缺失的一环。它支持在线监控执行的任务、支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务。

另外本组件的特色就是非常简单,或者说"轻量级",只有两个主要的类和一个前端静态 html 组成,Java 的话总共不超过 500 行代码。

核心原理

我们先进入原理层面谈谈(如果读者觉得太难可以先略过)。

  • 核心 ScheduleHandler 类,连完整的注释才 160 行。其作用如下:
    • 主要围绕 Spring 核心原理,从加载机制中得到哪些是定时器的方法,收集起来以便统一管理
    • 如何对任务控制呢?通过ScheduledTaskScheduledFuture,可以扩展实现动态修改任务状态、暂停/恢复任务,以及终止运行中任务。ScheduledTask 表示所有被@Scheduled注解修饰的任务
    • 如何得到 ScheduledTask 对象呢?这就涉及 Spring 加载机制了。众所周知,Spring 是一个开放系统,暴露了大量开放的接口供用户使用。其中原理我们不妨看看 ScheduleHandler源码就知道。
  • 控制器ScheduledController,这是提供 API 接口的。任务可以得到了,可是怎么对其管理呢?我们很自然地想到用数据库来进行 CRUD 的管理,但问题又来了,Spring 任务连个名称或者 id 都没有,怎么做数据库管理呢?笔者想了下,就是通过类名称和执行方法组成唯一的条件,就是一个独特的任务记录,可以进行入库和管理。这个类除了调用上述的 Spring ScheduledTask API 外,还有涉及的数据库的 CRUD 操作。其中一个怎么停止任务的地方,比较巧妙地说。
  • 前端 task.html,如下图所示,非常简单,

    就一个 HTML,仅仅依赖 vue.js(CDN 加载),而且 js/css 全在 HTML 里面,都是原生手写的,直接双击浏览器打开即可使用(当然你接口前提必须是跨域的)。非常方便你整合。

后端依赖的话,是我的框架AJAXJS,当然是非常轻量级的,连 MyBatis 都没依赖。如果你不打算依赖 AJAXJS,把这两个类抠出来也是非常简单的。

另外,该组件在 Spring MVC 5 下调试通过,无须 Spring Boot 亦可。

源码在:https://gitee.com/sp42_admin/ajaxjs/tree/master/aj-backend/aj-framework/aj-framework/src/main/java/com/ajaxjs/framework/spring/scheduled

使用配置

Spring 工程配置如下:

java 复制代码
// 初始化 Spring 任务调度器
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
    pool.setCorePoolSize(5); // 指定线程数
    pool.setMaxPoolSize(10);
    pool.setWaitForTasksToCompleteOnShutdown(true);

    return pool;
}

// 初始化任务调度管理
@Bean(initMethod = "init")
public ScheduleHandler scheduleHandler() {
    return new ScheduleHandler();
}

// 注入任务调度的控制器
@Bean
public ScheduledController scheduledController() {
    return new ScheduledController();
}

前端页面源码在这里。你要简单修改下接口地址什么的。

使用限制

对于固定频率的,fixedRate,因为不能获取其类和方法,故不能加入到任务管理中

java 复制代码
//每隔2秒执行一次
@Scheduled(fixedRate = 2000)
public void testTasks() {
    System.out.println("定时任务执行时间:" + dateFormat.format(new Date()));
}

但幸运地,可以转化为 Cron 表达式的,

java 复制代码
@Scheduled(cron = "0/2 * * * * *") // cron 表达式,每5秒执行
public void doTask() {
    System.out.println("我是定时任务~" + ATOMIC_LONG.getAndIncrement());
}

参考

其他同类的界面参考:

相关推荐
荆州克莱1 小时前
Redis | Redis常用命令及示例总结(API)
spring boot·spring·spring cloud·css3·技术
RainbowSea2 小时前
5. Spring Cloud OpenFeign 声明式 WebService 客户端的超详细使用
java·spring·spring cloud
听潮阁2 小时前
【SpringCloud详细教程】-02-微服务环境搭建
spring·spring cloud·微服务
跳跳的向阳花3 小时前
03-02、SpringCloud第二章,Eureka服务的注册与发现
spring·spring cloud·eureka
醇氧3 小时前
【spring 】Spring Cloud Gateway 的Filter学习
学习·spring·gateway
蚰蜒螟3 小时前
Spring gateway 路由 配置在数据库
数据库·spring·gateway
stormsha4 小时前
在 Sanic 框架中实现高效内存缓存的多种方法
spring boot·spring·缓存·sanic
泰山小张只吃荷园5 小时前
快速入门消息队列MQ、RabbitMQ
java·spring boot·分布式·spring·spring cloud·rabbitmq·java-rabbitmq
BestandW1shEs5 小时前
谈谈Spring的常见基础概念
java·spring
疯一样的码农5 小时前
Spring Security AuthenticationEntryPoint接口(处理未认证访问)
java·spring·spring security