轻量级 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.mzph.cn/news/38747.shtml

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

相关文章

python获取音乐文件

浏览器打开音乐地址 http://www.htqyy.com/top/hot 点击第一首歌曲,会打开新的网页并且可以获取 改歌曲的id,就是url中的33 在播放页面点击F12,打开开发者调试功能 如下图所示,在script脚本中可以获取歌曲的下载数据 host&#…

滑模控制器理论推导和matlab/simulink实例分享

滑模控制的运动轨迹主要分为两个方面:(1)系统的任意初始状态向滑模面运动阶段;(2)系统到达滑模面后并且慢慢趋于稳定的阶段。所以,对于滑模变结构控制器的设计,对应于系统运动的两个阶段,可以分为两个部分:…

从规划到落地,数字化工厂如何破局

随着第四次工业革命的推进,数字化工厂解决方案已经成为制造业转型升级的必经之路。然而,在实际推进过程中,许多企业却面临着规划难以落地、投资回报率低、人才短缺等问题。如何破局,实现数字化工厂的顺利转型,成为制造…

卡尔曼滤波

初见Kalman 假设我养了一只猪: 一周前,这只猪的体重是460.5kg。注意,在这里我用了0.5,表示其实我对这只猪一周前的体重并不是那么确定的,也就是说,46kg这个体重有0.5kg的误差。现在,我又养了这只…

计算机竞赛 python+opencv+机器学习车牌识别

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于机器学习的车牌识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分工作量:4分创新点:3分 该项目较为新颖,适…

使用插件实现pdf,word预览功能

效果 代码&#xff1a; 插件地址&#xff1a; https://github.com/501351981/vue-office <a-modalv-model:visible"visible":title"title"ok"handleOk":bodyStyle"bodyStyle":width"1200":maskClosable"false"…

2023年网络安全比赛--综合渗透测试(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.扫描目标靶机将靶机开放的所有端口,当作flag提交(例:21,22,23); 2.扫描目标靶机将靶机的http服务版本信息当作flag提交(例:apache 2.3.4); 3.靶机网站存在目录遍历漏洞,请将…

Linux设备树详解

Linux 设备树详解 Linux 操作系统早期是针对个人电脑设备而开发的操作系统&#xff0c;而个人电脑处理器产商较为单一&#xff08;例如只有 Intel&#xff0c;AMD&#xff09;同时个人电脑产商均使用 Intel 或 AMD 制造的处理器&#xff0c;业界形成了统一的总线/硬件接口标准…

JavaScript进阶 第二天

深入对象内置构造函数 一. 深入对象 创建对象三种方式构造函数实例成员&静态成员 1.1 创建对象三种方式 ① 利用对象字面量创建对象 const o {name: 哈哈 } ② 利用new Object 创建对象 const o new Object({ name: 哈哈 }) ③ 构造函数创建对象 1.2 构造函数 …

探索规律:Python地图数据可视化艺术

文章目录 一 基础地图使用二 国内疫情可视化图表2.1 实现步骤2.2 完整代码2.3 运行结果 一 基础地图使用 使用 Pyecharts 构建地图可视化也是很简单的。Pyecharts 支持多种地图类型&#xff0c;包括普通地图、热力图、散点地图等。以下是一个构建简单地图的示例&#xff0c;以…

认识Transformer:入门知识

视频链接&#xff1a; https://www.youtube.com/watch?vugWDIIOHtPA&listPLJV_el3uVTsOK_ZK5L0Iv_EQoL1JefRL4&index60 文章目录 Self-Attention layerMulti-head self-attentionPositional encodingSeq2Seq with AttentionTransformerUniversal Transformer Seq2Seq …

浅谈 EMP-SSL + 代码解读:自监督对比学习的一种极简主义风

论文链接&#xff1a;https://arxiv.org/pdf/2304.03977.pdf 代码&#xff1a;https://github.com/tsb0601/EMP-SSL 其他学习链接&#xff1a;突破自监督学习效率极限&#xff01;马毅、LeCun联合发布EMP-SSL&#xff1a;无需花哨trick&#xff0c;30个epoch即可实现SOTA 主要…

资讯速递 | ArkUI-X 预览版已正式开源!

OpenHarmony项目群技术指导委员会&#xff08;以下简称“TSC”&#xff09;-跨平台应用开发框架TSG所孵化项目 —— ArkUI-X&#xff0c;近期已正式开源 &#xff0c;开发者基于一套主代码&#xff0c;就可以将在OpenHarmony上开发的精美、高性能应用同时运行在Android、iOS等其…

LNMP环境搭建wordpress以及跳转后台报404解决

基于上文配置好的LNMP环境继续搭建wordpress 目录 一.到官网下载tar.gz包&#xff0c;并上传到Linux上&#xff0c;也可以通过复制链接地址进行下载 二. 将wordpress中的所有文件移动到你nginx.conf中指定目录中 三.为wordpress配置数据库 四.到浏览器进行注册 1.刚开始…

好用的安卓手机投屏到mac分享

工具推荐&#xff1a;scrcpy github地址&#xff1a;https://github.com/Genymobile/scrcpy/tree/master mac使用方式 安装环境&#xff0c;打开terminal&#xff0c;执行以下命令&#xff0c;没有brew的先安装brew brew install scrcpy brew install android-platform-too…

学习 Iterator 迭代器

今天看到一个面试题&#xff0c; 让下面解构赋值成立。 let [a,b] {a:1,b:2} 如果我们直接在浏览器输出这行代码&#xff0c;会直接报错&#xff0c;说是 {a:1,b:2} 不能迭代。 看了es6文档后&#xff0c;具有迭代器的就一下几种类型&#xff0c;没有Object类型&#xff0c;…

404. 左叶子之和

给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24示例 2: 输入: root [1] 输出: 0提示: 节点…

【NetCore】09-中间件

文章目录 中间件&#xff1a;掌控请求处理过程的关键1. 中间件1.1 中间件工作原理1.2 中间件核心对象 2.异常处理中间件:区分真异常和逻辑异常2.1 处理异常的方式2.1.1 日常错误处理--定义错误页的方法2.1.2 使用代理方法处理异常2.1.3 异常过滤器 IExceptionFilter2.1.4 特性过…

react实现对数组做增删改操作自定义hook

需求 实现对数组的增删改操作。 实现 import { useState } from react;const useArray (currList) > {const [list, setList] useState(currList);// 增const addItem (item) > {setList([...list, item]);};// 删const removeItem (idx) > {const _arr [...l…

实战指南,SpringBoot + Mybatis 如何对接多数据源

系列文章目录 MyBatis缓存原理 Mybatis plugin 的使用及原理 MyBatisSpringboot 启动到SQL执行全流程 数据库操作不再困难&#xff0c;MyBatis动态Sql标签解析 从零开始&#xff0c;手把手教你搭建Spring Boot后台工程并说明 Spring框架与SpringBoot的关联与区别 Spring监听器…