轻量级 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 工程配置如下:

// 初始化 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,因为不能获取其类和方法,故不能加入到任务管理中

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

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

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

参考

  • 从零搭建开发脚手架 基于Spring Task实现动态管理任务 和本文一个思想,但它的好像对 Task 包了一层,显得有点复杂。不过考虑到高并发的设计
  • Spring Boot Task 定时任务升级(启动、停止、变更执行周期) 说原理的
  • @Scheduled定时任务管理界面 本组件就是从它启发的!——大幅度重构
  • Schedule 调度系统设计(单机版) 可惜看不到源码了
  • 轻量级分布式任务调度框架 Light Task Schedule 这个其实很庞大跟复杂,看看就好
  • 在线Cron表达式生成器
  • SandGlass 是一款为 java 设计的分布式任务调度工具

其他同类的界面参考:

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/92196.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ReactDOM模块react-dom/client没有默认导出报错解决办法

import ReactDOM 模块“"E:/Dpandata/Shbank/rt-pro/node_modules/.pnpm/registry.npmmirror.comtypesreact-dom18.2.7/node_modules/types/react-dom/client"”没有默认导出。 解决办法 只需要在tsconfig.json里面添加配置 "esModuleInterop": true 即…

数据结构介绍

1、什么是数据结构呢? 计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。数据结构是为了更方便的管理和使用数据,需要结合具体的业务来进行选择。一般情况下,精心选择的数据结构可以带来更高的运行或者存储效率。…

6.利用matlab完成 符号矩阵的秩和 符号方阵的逆矩阵和行列式 (matlab程序)

1.简述 利用M文件建立矩阵 对于比较大且比较复杂的矩阵,可以为它专门建立一个M文件。下面通过一个简单例子来说明如何利用M文件创建矩阵。 例2-2 利用M文件建立MYMAT矩阵。(1) 启动有关编辑程序或MATLAB文本编辑器,并输入待建矩阵:(2) 把…

【2023年11月第四版教材】《第5章-信息系统工程之软件工程(第一部分)》

《第5章-信息系统工程(第一部分)》 章节说明1 软件工程1.1 架构设计1.2 需求分析 章节说明 65%为新增内容, 预计选择题考5分,案例和论文不考;本章与第三版教材一样的内容以楷体字进行标注! 1 软件工程 1.1 架构设计 1、软件架…

Linux文件权限一共10位长度,分成四段

Linux文件权限一共10位长度,分成四段 Linux文件权限 1、 文件aaa的访问权限为rw-r--r--,现要增加所有用户的执行权限和同组用户的写权限,下列哪些命令是正确的? a) chmod ax gw aaa √ b) chmod 764 aaa c) chmod 775 aaa √ d)…

vue3+vite+pinia

目录 一、项目准备 1.1、Vite搭建项目 1.2、vue_cli创建项目 二、组合式API(基于setup) 2.1、ref 2.2、reactive 2.3、toRefs 2.4、watch和watchEffect 2.5、computed 2.6、生命周期钩子函数 2.7、setup(子组件)的第一个参数-props 2.8、setup(子组件)的第二个参数…

贴吧照片和酷狗音乐简单爬取

爬取的基本步骤 很简单,主要是两大步 向url发起请求 这里注意找准对应资源的url,如果对应资源不让程序代码访问,这里可以伪装成浏览器发起请求。 解析上一步返回的源代码,从中提取想要的资源 这里解析看具体情况,一…

什么是前端框架?怎么学习? - 易智编译EaseEditing

前端框架是一种用于开发Web应用程序界面的工具集合,它提供了一系列预定义的代码和结构,以简化开发过程并提高效率。 前端框架通常包括HTML、CSS和JavaScript的库和工具,用于构建交互式、动态和响应式的用户界面。 学习前端框架可以让您更高效…

python爬虫——爬虫伪装和反“反爬”

前言 爬虫伪装和反“反爬”是在爬虫领域中非常重要的话题。伪装可以让你的爬虫看起来更像普通的浏览器或者应用程序,从而减少被服务器封禁的风险;反“反爬”则是应对服务器加强的反爬虫机制。下面将详细介绍一些常见的伪装和反反爬技巧,并提…

加杠杆的股票类型是什么?

加杠杆的股票类型在投资领域有不同的称呼,包括杠杆股票、倍增股票、奇特股票等。这些股票类型都具有共同的特点,即提供给投资者以杠杆交易的机会,可以放大投资的回报。以下是对加杠杆的股票类型的介绍。 1. 杠杆型基金:杠杆型基金…

Java+Excel+POI+testNG基于数据驱动做一个简单的接口测试【杭州多测师_王sir】

一、创建一个apicases.xlsx放入到eclipse的resource里面&#xff0c;然后refresh刷新一下 二、在pom.xml文件中加入poi和testng的mvn repository、然后在eclipse的对应目录下放入features和plugins&#xff0c;重启eclipse就可以看到testNG了 <!--poi excel解析 --><d…

ChatGPT​保密吗?它有哪些潜在风险?如何规避?

自2022年11月公开发布以来&#xff0c;ChatGPT已成为许多企业和个人的必备工具&#xff0c;但随着该技术越来越多地融入我们的日常生活&#xff0c;人们很自然地想知道&#xff1a;ChatGPT是否是保密的。 问&#xff1a;ChatGPT保密吗&#xff1f; 答&#xff1a;否&#xff0…

Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理

Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理 目录 Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理 一、简单介绍 二、实现原理 三、实现步骤 四、关键代码 一、简单介绍 Unity 工具类&#xff0c;自己整理的一些游戏开发可…

企事业数字培训及知识库平台

前言 随着信息化的进一步推进&#xff0c;目前各行各业都在进行数字化转型&#xff0c;本人从事过医疗、政务等系统的研发&#xff0c;和客户深入交流过日常办公中“知识”的重要性&#xff0c;再加上现在倡导的互联互通、数据安全、无纸化办公等概念&#xff0c;所以无论是企业…

jvs-rules API数据源配置说明(含配置APIdemo视频)

在JVS中&#xff0c;多数据源支持多种形态的数据接入&#xff0c;其中API是企业生产过程中常见的数据形态。使用数据源的集成配置&#xff0c;以统一的方式管理和集成多个API的数据。这些平台通常提供各种数据转换和处理功能&#xff0c;使得从不同数据源获取和处理数据变得更加…

tomcat设置PermSize

最近tomcat老是报错,查看了日志出现PermGen 内存不够用,重启tomcat后查询使用情况 通过启动参数发现没有设置 PermGen,继续通过jmap查看 jmap -heap 21179 发现99%已使用,而且默认是30.5M,太小了,这里设置成256M 1. 创建setenv.sh文件 在/usr/local/tomcat/bin目录下创建一个…

Gradio部署应用到服务器不能正常访问

用Gradio部署一个基于ChatGLM-6B的应用&#xff0c;发布到团队的服务器上&#xff08;局域网&#xff0c;公网不能访问&#xff09;&#xff0c;我将gradio应用发布到服务器的9001端口 import gradio as gr with gr.Blocks() as demo:......demo.queue().launch(server_port90…

leetcode228. 汇总区间

题目 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b]…

BUUCTF pwn1_sctf_2016解题思路

题目代码 Welcome to index.php <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack It! class Modifier {protected $var;publi…

04 qt功能类、对话框类和文件操作

一 QT中时间和日期 时间 ---- QTime日期 ---- QDate对于Qt而言,在实际的开发过程中, 1)开发者可能知道所要使用的类 ---- >帮助手册 —>索引 -->直接输入类名进行查找 2)开发者可能不知道所要使用的类,只知道开发需求文档 ----> 帮助 手册,按下图操作: 1 …