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

news2024/12/26 23:20:04

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表达式生成器

其他同类的界面参考:

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Qt扫盲-QWidget理论使用总结

QWidget理论使用总结 一、概述二、顶层 控件 和子 控件三、复合控件四、自定义控件和绘制五、大小提示和大小策略六、事件七、一组函数和属性八、QWidget样式表九、透明度和双缓冲十、创建半透明窗口 一、概述 widget 是用户界面的最小单位:它从window系统接收鼠标…

STM32F429IGT6使用CubeMX配置串口通信

1、硬件电路 2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz 3、配置USART1引脚 4、生成工程配置 5、部分代码 //重定向printf函数 int fputc(int ch, FILE *f) {HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);return ch; } /* USER CODE BE…

初学vue3时应该注意的几个问题

初学vue3时应该注意的几个问题 声明响应式 响应式数据的声明在vue2的时候很简单,在data中声明就行了。但现在可以使用多个方式。 reactive用于声明Object, Array, Map, Set; ref用于声明String, Number, Boolean 使用reactive来声明基础数据类型(Str…

华为OD机试真题 Java 实现【寻找相同子串】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…

Leetcode-每日一题【剑指 Offer 26. 树的子结构】

题目 输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。 例如: 给定的树 A: 3 / \ 4 5 / \ 1 2 给定的树 B: 4 / 1 返回 true&#xff0…

超全的数据可视化大屏设计组件库 sketch格式

随着大屏可视化设计需求的发展,可视化sketch矢量素材变得越来越受欢迎,它可以为设计师提供丰富的设计元素,帮助他们更高效更快速的完成设计任务。 大屏可视化sketch数量素材是B端可视化设计师们最佳设计资源,它可以帮助设计师轻松…

iOS开发-实现二维码扫一扫Scan及识别图片中二维码功能

iOS开发-实现二维码扫一扫Scan及识别图片中二维码功能 在iOS开发中,会遇到扫一扫功能,扫一扫是使用摄像头扫码二维码或者条形码,获取对应二维码或条形码内容字符串。通过获得的字符串进行跳转或者打开某个页面开启下一步的业务逻辑。 https…

C++ 管理系统实战

C 管理系统实战 1. 目录结构 2. workClass.h /********************************************************************************* file : employee.h* author : zhong* brief : None* attention : None* date : 2023/8/10*****…

使用阿里云服务器搭建ThinkPHP框架全流程_新手入门

阿里云百科分享使用lay服务器搭建ThinkPHP全流程,ThinkPHP是一款免费、开源、快速、简单、面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,是为了敏捷Web应用开发和简化企业应用开发而诞生的。本篇教程介绍如何使用云市场镜像快速搭建…

学术论文GPT源码解读:从chatpaper、chatwithpaper到gpt_academic

前言 之前7月中旬,我曾在微博上说准备做“20个LLM大型项目的源码解读” 针对这个事,目前的最新情况是 已经做了的:LLaMA、Alpaca、ChatGLM-6B、deepspeedchat、transformer、langchain、langchain-chatglm知识库准备做的:chatpa…

b站如何调整视频播放倍速3倍

b站pc网页端目前最大倍速为2倍,可以手动调节倍速的一个办法 视频页面-按下f12-点击console-复制粘贴代码-按下enter回车键 下面是代码,3可以换成自己想要的倍速,最大可以16倍速 document. querySelector(video).playbackRate3

C++笔记之静态成员函数的使用场景

C笔记之静态成员函数的使用场景 C静态成员函数的核心特点是不与特定类实例相关,可通过类名直接调用,用于执行与类相关的操作而无需创建类对象。其主要用途是在类级别上共享功能,管理全局状态或提供工具函数。 code review! 文章目录 C笔记之…

移远RM500U-CN模块直连嵌入式ubuntu实现拨号上网

目录 1 平台: 2 需要准备的资料 3 参考文档 4 编译环境与驱动移植 4.1 内核驱动添加厂家ID和产品ID 4. 2.添加零包处理 4.3 增加复位恢复机制 4.4 增加批量输出 批量输出 URB 的数量和容量 的数量和容量 4.5 内核配置与编译 5 QM500U-CN拨号(在开…

tensorflow / tensorflow-gpu cuda cudNN tensorRT 安装,启用显卡加速

tensorflow / tensorflow-gpu cuda cudNN tensorRT 安装,启用显卡加速 说明 Tensorflow-GPU 已被移除。请安装 tensorflow 。 tensorflow 通过 Nvidia CUDA 支持 GPU 加速操作。 自 2019 年 9月发布 的 TensorFlow2.1 以来,tensorFlow 和 tensorflow-GPU 一直是同…

NFT Insider#102:The Sandbox重新上线LAND桥接服务,YGG加入Base生态

引言:NFT Insider由NFT收藏组织WHALE Members(https://twitter.com/WHALEMembers)、BeepCrypto(https://twitter.com/beep_crypto)联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周…

【JVM】类装载的执行过程

文章目录 类装载的执行过程1.加载2.验证3.准备4.解析5.初始化6.使用7.卸载 类装载的执行过程 类装载总共分为7个过程,分别是 加载,验证,准备、解析、初始化、使用、卸载 1.加载 将类的字节码文件加载到内存(元空间)中。这一步会…

实时时钟+闹钟

在江科大实时时钟的基础上添加闹钟的配置,参考http://t.csdn.cn/YDlYy。 实现功能 :每隔time秒蜂鸣器响一次、设置闹钟的年月日时分秒,到时间蜂鸣器响。 前三个函数没有变,添加 void RTC_AlarmInit(void) 闹钟的中断配置void…

分享Python技术下AutojsPro7云控代码

引言 有图有真相,那短视频就更是真相了。下面是三大语言的短视频。 Java源码版云控示例: Java源码版云控示例在线视频 Net源码版云控示例: Net源码版云控示例在线视频亚丁号-知识付费平台 支付后可见 扫码付费可见 Python源码版云控示例…

STM32CubeMX之freeRTOS消息通知(有点全能)

任务通知是任务自带的程序,不需要单独去创建 一: 二: 进入前不清除数据,退出清除数据参数 0x0000000000 0xffffffff的意思 三: 这里就是发送过去,然后把其存到了num中 不要有太多疑问,并不是发…

【Linux】TCP协议简介

TCP协议简介 TCP协议格式面向连接1.连接管理机制2.包序管理 可靠传输1.保证数据可靠到达对端2.保证数据的传输效率 面向字节流TCP粘包问题 TCP协议格式 16位源端口号和16位目的端口号:标识数据从哪个进程来,到哪个进程…