Spring Boot和XXL-Job:高效定时任务管理
Spring Boot和XXL-Job:高效定时任务管理
- 前言
- 第一:XXL-Job简介
- 什么是XXL-job
- 对比别的任务调度
- 第二: springboot整合XXL-job
- 配置XXL-Job Admin
- 拉取XXL-Job代码
- 修改拉取的配置
- 配置执行器
- 自己的项目如何整合
- maven依赖
- properties文件配置
- 执行器组件配置
- jobhandler配置
- 实现效果
- 第三:@XxlJob中参数详解
- 第四:最佳实践
前言
“在现代应用程序中,定时任务是不可或缺的一部分。Spring Boot和XXL-Job为你提供了一个强大的工具组合,以简化任务调度和管理。本文将带领你探索如何将这两者集成在一起,实现高效的定时任务管理。无论你是初学者还是有经验的开发者,本文都将提供你所需要的知识,让你轻松掌握这一技术。让我们开始吧!”
第一:XXL-Job简介
什么是XXL-job
【官网地址】https://www.xuxueli.com/xxl-job/
XXL-Job是一个开源的分布式任务调度平台,主要用于解决大规模分布式系统中的任务调度和管理问题。下面是XXL-Job的简介,重点强调其分布式任务调度的特点:
XXL-Job简介:
XXL-Job是一个基于Java开发的分布式任务调度平台,旨在帮助开发者和运维人员管理和调度任务,特别适用于大规模分布式应用。它提供了直观的Web界面,易于配置和监控各种类型的任务。XXL-Job的关键特点包括:
-
分布式任务调度:
- XXL-Job支持分布式任务调度,可以轻松处理任务分布在不同节点的情况。这对于大型微服务架构和集群环境非常有用。
-
弹性扩展:
- XXL-Job支持弹性扩展,你可以随时增加或减少执行器节点,以适应不同负载和任务需求。这确保了高可用性和性能。
-
任务调度中心:
- XXL-Job提供了一个任务调度中心,可以集中管理和监控任务。你可以在Web界面上创建、编辑、删除任务,查看任务日志和统计信息。
-
多种任务类型:
- 支持多种任务类型,包括简单的定时任务、Bean调用、Shell脚本、HTTP任务、GLUE任务(动态语言任务),满足各种任务需求。
-
任务依赖和失败重试:
- XXL-Job允许你配置任务之间的依赖关系,确保任务按照指定的顺序执行。同时,它支持失败重试机制,确保任务在失败时能够重新执行。
-
报警和日志:
- 提供了报警机制,可以通过邮件、短信等方式通知任务执行结果。任务执行日志也可以在Web界面中查看,便于故障排查和监控。
-
开源和社区支持:
- XXL-Job是开源项目,拥有活跃的社区支持和持续的更新。你可以根据自己的需求进行定制和扩展。
XXL-Job的分布式任务调度特点使其成为处理大规模、复杂任务调度需求的强大工具。它可以帮助开发团队更好地管理任务,提高系统的可靠性和可维护性,同时降低了任务调度的复杂性。
对比别的任务调度
XXL-Job在分布式任务调度领域有其独特之处,下面是它与其他一些任务调度解决方案的比较,以突出其优势和特点:
-
Quartz:
- Quartz是一个强大的Java任务调度框架,但通常需要额外的配置和管理来支持分布式环境。XXL-Job提供了更易于配置和管理的分布式任务调度方案。
- XXL-Job的Web界面和报警机制更加现代化,便于任务管理和监控。
-
Spring的@Scheduled:
- Spring的
@Scheduled
注解适用于单节点应用程序,而XXL-Job专门设计用于分布式任务调度,支持在多个节点上执行任务。 - XXL-Job提供了任务依赖和失败重试的机制,以处理复杂任务流程。
- Spring的
-
Elastic Job:
- Elastic Job是另一个分布式任务调度框架,但XXL-Job更注重任务的可视化管理,提供了直观的Web界面。
- XXL-Job的报警机制更加丰富,能够及时通知任务执行结果。
-
Akka Scheduler:
- Akka是一个并发编程库,它提供了定时任务功能,但相对更加复杂。XXL-Job更适合那些希望通过Web界面轻松管理任务的团队。
- XXL-Job的弹性扩展特性使其适用于大规模分布式系统。
-
Cron4J:
- Cron4J是一个轻量级的Java定时任务库,适用于简单任务。XXL-Job提供了更多高级功能,如任务依赖、失败重试和任务监控。
总体而言,XXL-Job在分布式任务调度方面的优势在于其易用性、可视化管理、分布式支持、任务依赖和报警机制。它是一个强大的工具,特别适合需要大规模任务调度和监控的应用程序。然而,具体选择取决于项目需求,一些轻量级的解决方案可能在小型应用中更加合适。
第二: springboot整合XXL-job
配置XXL-Job Admin
拉取XXL-Job代码
1️⃣:【gitee】https://gitee.com/xuxueli0323/xxl-job
2️⃣:【github】https://github.com/xuxueli/xxl-job/
♉️:上面的github和gitee都可以选择,然后拉取下来
修改拉取的配置
1️⃣:执行拉取下来的sql:/xxl-job/doc/db/tables_xxl_job.sql
2️⃣:修改调度中心配置/xxl-job/xxl-job-admin/src/main/resources/application.properties
### web,端口,这里我修改了,默认是8080
server.port=9998
# 修改连接数据库配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3361/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456### xxl-job, access token,注意这里的accessToken在执行器中也需要配置(一致)
xxl.job.accessToken=eyJhbGciOiJIUzI1NiJ9
3️⃣:修改/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/logback.xml
,否则可能会报错
<!-- 这里需要修改的值如下,不然会找不到日志路径-->
<property name="log.path" value="./logs/xxl-job-admin.log"/>
4️⃣:访问http://127.0.0.1:9998/xxl-job-admin,这里端口是你上面配置的,输入默认的账号密码admin/123456
🔚:到这里调度中心就配置好了
配置执行器
这里其实刚刚拉取的项目下就涵盖了执行器,包括无框架的以及springboot框架的
自己的项目如何整合
maven依赖
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.4.0</version>
</dependency>
properties文件配置
### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;这里的ip也是上面调度中心的
xxl.job.admin.addresses=http://127.0.0.1:9998/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;这里的密码是上面调度中心的
xxl.job.accessToken=eyJhbGciOiJIUzI1NiJ9
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-executor-xiaobo
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=./logs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=30
执行器组件配置
package com.todoitbo.baseSpringbootDasmart.config;import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.springframework.beans.factory.annotation.Value;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author xiaobo* @date 2023/10/24*/
@Configuration
@Slf4j
public class XxlJobConfig {@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.executor.appname}")private String appname;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.accesstoken}")private String accessToken;@Value("${xxl.job.executor.logpath}")private String logPath;@Value("${xxl.job.executor.logretentiondays}")private int logRetentionDays;@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {log.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appname);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}
}
jobhandler配置
package com.todoitbo.baseSpringbootDasmart.handler;import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;/*** @author xiaobo* @date 2023/10/24*/
@Component
public class JobHandler {@XxlJob("demoJobHandler")public void demoJobHandler() throws Exception {XxlJobHelper.log("XXL-JOB, Hello World.");}
}
拉取下来的代码中
/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java
是更详细的配置
实现效果
1️⃣:启动项目,出现如下即成功
2️⃣:任务调度页面中加入执行器
3️⃣:配置任务
4️⃣:启动任务
⚠️:这里如果你要执行一次的话,机器地址一定是带http的,比如http://127.0.0.1:9999
如果是启动的话,先点击注册节点,再启动即可
第三:@XxlJob中参数详解
以下是这三个参数的详细说明:
-
value:
- 参数类型: String
- 说明: 任务的名字,必须是唯一的。在XXL-Job Admin中配置任务时,这个值用于标识任务。
-
init:
- 参数类型: String
- 说明: 任务初始化时的方法名。这个方法会在任务第一次执行前被调用,通常用于初始化一些资源。方法必须是无参数的。
-
destroy:
- 参数类型: String
- 说明: 任务销毁时的方法名。这个方法会在任务最后一次执行后被调用,通常用于释放资源。方法必须是无参数的。
这三个参数是@XxlJob
注解的基本参数,用于定义任务的基本属性。
第四:最佳实践
使用Spring Boot和XXL-Job进行任务调度是一种强大的方式,但也有一些常见的错误和最佳实践,以下是一些建议,帮助读者避免这些错误并在实际项目中取得成功:
-
详细记录任务日志:
- 记录任务的执行日志是非常重要的,它可以帮助你追踪任务的执行情况,及时发现问题。确保在任务Handler中添加详细的日志信息。
-
参数校验:
- 在任务Handler中对传递的参数进行合法性校验,以避免不必要的异常和错误。
-
任务幂等性:
- 确保任务的逻辑是幂等的,即多次执行不会产生不同的结果。这对于任务失败后的重试非常重要。
-
失败处理:
- 配置任务的失败处理策略,包括重试次数、重试间隔等。这可以帮助应对临时问题,如网络故障或资源不足。
-
任务依赖:
- 如果任务之间存在依赖关系,确保在XXL-Job Admin中正确配置任务的依赖关系,以保证任务按照正确的顺序执行。
-
动态调度:
- 利用XXL-Job的动态调度功能来应对实时需求的变化,如动态调整任务触发时间、任务取消、任务延迟等。
-
监控与报警:
- 集成监控和报警系统,可以帮助你实时监测任务的执行情况,及时发现问题并采取措施。XXL-Job提供了与监控系统的集成支持。
-
版本管理:
- 使用版本控制工具(如Git)来管理任务Handler代码,以便跟踪任务逻辑的变化和恢复历史版本。
-
测试任务逻辑:
- 在开发任务Handler时进行充分的单元测试,确保任务逻辑的正确性。XXL-Job提供了一些测试工具,如JobLogger。
-
集群部署:
- 如果需要,部署XXL-Job执行器节点以提高任务的可用性和负载均衡。
-
版本升级:
- 定期关注XXL-Job的更新版本,确保使用最新的稳定版本,以获得最新的功能和 bug 修复。
-
安全性:
- 保护XXL-Job Admin的访问权限,防止未经授权的访问。不要在任务逻辑中存储敏感信息。
-
文档和培训:
- 提供适当的文档和培训,以便项目团队了解如何使用XXL-Job和任务调度最佳实践。
遵循这些最佳实践可以帮助你更好地使用Spring Boot和XXL-Job,确保任务调度系统的可靠性和稳定性。这对于生产环境中的任务调度至关重要。
相关文章:

Spring Boot和XXL-Job:高效定时任务管理
Spring Boot和XXL-Job:高效定时任务管理 前言第一:XXL-Job简介什么是XXL-job对比别的任务调度 第二: springboot整合XXL-job配置XXL-Job Admin拉取XXL-Job代码修改拉取的配置 配置执行器自己的项目如何整合maven依赖properties文件配置执行器…...

3、QtCharts 动态曲线图
文章目录 效果声明变量构建静态图表创建计时器连接信号与槽槽函数核心代码 效果 声明变量 构建静态图表 //构建曲线系列m_splineSerisenew QSplineSeries(this);//为折线添加数据qreal x0.f;for (size_t i0;i<c_MaxSize;i){xqreal(i1)/c_MaxSize;m_splineSerise->append(…...

Linux下自动挂载U盘或者USB移动硬盘
最近在折腾用树莓派(实际上是平替香橙派orangepi zero3)搭建共享文件服务器,有一个问题很重要,如何在系统启动时自动挂载USB移动硬盘。 1 使用/etc/fstab 最开始尝试了用/etc/fstab文件下增加:"/dev/sda1 /home/orangepi/s…...

一文通透位置编码:从标准位置编码到旋转位置编码RoPE
前言 关于位置编码和RoPE 我之前在本博客中的另外两篇文章中有阐述过(一篇是关于LLaMA解读的,一篇是关于transformer从零实现的),但自觉写的不是特别透彻好懂再后来在我参与主讲的类ChatGPT微调实战课中也有讲过,但有些学员依然反馈RoPE不是…...

八皇后问题
1、问题描述 在棋盘上放置 8 个皇后,使得它们互不攻击,此时每个皇后的攻击范围为同行同列和同对角线,要求找出所有解,如下图所示。 左图为皇后的攻击范围,右图为一个可行解。 2、分析 最简单的思路是把问题转化为 “…...

UE4/UE5 设置widget中text的字体Outline
想要在蓝图中控制Widget 中的 text字体,对字体outline参数进行设置。 但是蓝图中无法直接获取设置outline参数的方法: 没有outline相关的蓝图函数 该参数本身是在Font类别下的扩展,所以只要获取设置Font参数即可进行outline的设置 text连出…...

漏洞复现-phpmyadmin_SQL注入 (CVE-2020-5504)
phpmyadmin SQL注入 _(CVE-2020-5504) 漏洞信息 CVE-2020-5504sql注入漏洞Phpmyadmin 5.00以下 描述 phpMyAdmin是Phpmyadmin团队的一套免费的、基于Web的MySQL数据库管理工具。该工具能够创建和删除数据库,创建、删除、修改数据库表&…...

安装虚拟机(VMware)保姆级教程及配置虚拟网络编辑器和安装WindowsServer以及宿主机访问虚拟机和配置服务器环境
目录 一、操作系统 1.1.什么是操作系统 1.2.常见操作系统 1.3.个人版本和服务器版本的区别 1.4.Linux的各个版本 二、VMware Wworkstation Pro虚拟机的安装 1.下载与安装 注意:VMWare虚拟网卡 2.配置虚拟网络编辑器 三、安装配置 WindowsServer 1.创建虚拟…...
vue表格列表导出excel
你可以通过下面的步骤使用Vue导出Excel表格: 安装依赖 安装两个依赖包: npm install --save xlsx file-saver创建Excel导出方法 //导出 Excel exportExcel() {// 表格数据let data this.tableData;// 转化为工作簿对象const workbook XLSX.utils.bo…...

CSS基础入门03
目录 1.圆角矩形 1.1基本用法 1.2生成圆形 1.3生成圆角矩形 1.4展开写法 2.Chrome 调试工具--查看 CSS 属性 2.1打开浏览器 2.2标签页含义 2.3elements 标签页使用 3.元素的显示模式 3.1块级元素 3.2行内元素/内联元素 3.3行内元素和块级元素的区别 3.4改变显示模…...

大数据架构设计理论与实践
大数据架构设计理论与实践 大数据处理系统概述 传统数据处理系统存在的问题 大数据处理系统面临的挑战 大数据处理系统的属性/特征 典型的大数据架构 Lambda架构 Lambda定义 优缺点 应用场景 Lambda的体系结构( Batch Layer (批处理层)、Speed Layer (加速层)、Serving Lay…...
2024级199管理类联考之英语二2200核心词汇(第三天)
abstract 抽象的,非具体的 n-摘要ideal adj -理想的 n-理想idealized 理想化的ideology 意识形态,思想体系concept 观念,概念 conception n-构想,怀孕,观念awareness 意识,认识significant 重要的,有意义的 significance n-意义,重要性major v-主修 adj-主要的,成年的 n-成年人…...

SQL中:语法总结(group by,having ,distinct,top,order by,like等等)
语法总结:group by,distinct ...... 1.group by2.聚集函数count 3.order by4.增insert、删(drop、delete)、改(update、alter)5.查select嵌套查询不相关子查询相关子查询使用的谓词使用的谓词子查询的相关谓…...
13.计算机视觉
#pic_center R 1 R_1 R1 R 2 R^2 R2 目录 知识框架No.1 数据增广一、数据增广二、D2L代码注意点三、QA No.2 微调一、微调二、D2L代码注意点三、QA No.3 第二次竞赛 树叶分类结果No.4 实战 Kaggle 比赛:图像分类(CIFAR-10)一、Kaggle Cifar…...
关于Java中的运算符
文章目录 前言一、什么是运算符二、算术运算符1.基本四则运算符:加减乘除模( - * / %)2.增量运算符( - * /*)3.自增/自减运算符( --) 三、关系运算符四、逻辑运算符1.逻辑&&2.逻辑||3.逻辑非!4.短路求值 五、位运算六、移位运算七、条件运算符八…...

细说RTSP、RTMP和GB28181区别
好多流媒体初学者,对RTSP、RTMP和GB28181三者容易混淆,不了解他们的使用场景和区别,本文抛砖引玉,大概介绍下三者的区别。 RTSP(Real-Time Streaming Protocol)、RTMP(Real-Time Messaging Pro…...

Windows下安装Anaconda、Pycharm以及iflycode插件图解
目录 一、下载Anaconda、Pycharm以及iflycode插件 二、创建相关文件夹 三、Pycharm社区版安装详细步骤 四、Anaconda安装详细步骤 五、配置Pycharm 六、安装iflycode插件 Anaconda是一款集成的Python环境,anaconda可以看做Python的一个集成安装,安…...
Steger算法实现结构光光条中心提取(python版本)
Steger算法原理 对结构光进行光条中心提取时,Steger算法是以Hessian矩阵为基础的。它的基础步骤如下所示: 从Hessian矩阵中求出线激光条纹的法线方向在光条纹法线方向上将其灰度分布按照泰勒多项式展开,求取的极大值即为光条在该法线方向上的亚像素坐标。对于二维离散图像来…...
【完整解题】2023年第四届MathorCup高校数学建模挑战赛——大数据竞赛B题 思路代码文章电商零售商家需求预测及库存优化问题
赛道 B: 电商零售商家需求预测及库存优化问题 问题背景: 电商平台存在着上千个商家,他们会将商品货物放在电商配套的仓库, 电商平台会对这些货物进行统一管理。通过科学的管理手段和智能决策, 大数据智能驱动的供应链可…...

服务网络基础
服务网络基础 目录 前言 从今天开始我们将进入服务网格的学习,服务网格是微服务架构中的一种重要的技术,它可以解决微服务架构中的一些问题,比如服务发现、服务治理、服务监控等等,我们将从服务网格的基础开始,逐步深…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...