Spring Boot和XXL-Job:高效定时任务管理

news2024/11/16 7:21:08

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的关键特点包括:

  1. 分布式任务调度:

    • XXL-Job支持分布式任务调度,可以轻松处理任务分布在不同节点的情况。这对于大型微服务架构和集群环境非常有用。
  2. 弹性扩展:

    • XXL-Job支持弹性扩展,你可以随时增加或减少执行器节点,以适应不同负载和任务需求。这确保了高可用性和性能。
  3. 任务调度中心:

    • XXL-Job提供了一个任务调度中心,可以集中管理和监控任务。你可以在Web界面上创建、编辑、删除任务,查看任务日志和统计信息。
  4. 多种任务类型:

    • 支持多种任务类型,包括简单的定时任务、Bean调用、Shell脚本、HTTP任务、GLUE任务(动态语言任务),满足各种任务需求。
  5. 任务依赖和失败重试:

    • XXL-Job允许你配置任务之间的依赖关系,确保任务按照指定的顺序执行。同时,它支持失败重试机制,确保任务在失败时能够重新执行。
  6. 报警和日志:

    • 提供了报警机制,可以通过邮件、短信等方式通知任务执行结果。任务执行日志也可以在Web界面中查看,便于故障排查和监控。
  7. 开源和社区支持:

    • XXL-Job是开源项目,拥有活跃的社区支持和持续的更新。你可以根据自己的需求进行定制和扩展。

XXL-Job的分布式任务调度特点使其成为处理大规模、复杂任务调度需求的强大工具。它可以帮助开发团队更好地管理任务,提高系统的可靠性和可维护性,同时降低了任务调度的复杂性。

对比别的任务调度

XXL-Job在分布式任务调度领域有其独特之处,下面是它与其他一些任务调度解决方案的比较,以突出其优势和特点:

  1. Quartz:

    • Quartz是一个强大的Java任务调度框架,但通常需要额外的配置和管理来支持分布式环境。XXL-Job提供了更易于配置和管理的分布式任务调度方案。
    • XXL-Job的Web界面和报警机制更加现代化,便于任务管理和监控。
  2. Spring的@Scheduled:

    • Spring的@Scheduled注解适用于单节点应用程序,而XXL-Job专门设计用于分布式任务调度,支持在多个节点上执行任务。
    • XXL-Job提供了任务依赖和失败重试的机制,以处理复杂任务流程。
  3. Elastic Job:

    • Elastic Job是另一个分布式任务调度框架,但XXL-Job更注重任务的可视化管理,提供了直观的Web界面。
    • XXL-Job的报警机制更加丰富,能够及时通知任务执行结果。
  4. Akka Scheduler:

    • Akka是一个并发编程库,它提供了定时任务功能,但相对更加复杂。XXL-Job更适合那些希望通过Web界面轻松管理任务的团队。
    • XXL-Job的弹性扩展特性使其适用于大规模分布式系统。
  5. 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;

    @Bean
    public 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️⃣:启动项目,出现如下即成功

image-20231024174124470

2️⃣:任务调度页面中加入执行器

在这里插入图片描述

3️⃣:配置任务

在这里插入图片描述

4️⃣:启动任务

⚠️:这里如果你要执行一次的话,机器地址一定是带http的,比如http://127.0.0.1:9999

如果是启动的话,先点击注册节点,再启动即可

第三:@XxlJob中参数详解

以下是这三个参数的详细说明:

  1. value:

    • 参数类型: String
    • 说明: 任务的名字,必须是唯一的。在XXL-Job Admin中配置任务时,这个值用于标识任务。
  2. init:

    • 参数类型: String
    • 说明: 任务初始化时的方法名。这个方法会在任务第一次执行前被调用,通常用于初始化一些资源。方法必须是无参数的。
  3. destroy:

    • 参数类型: String
    • 说明: 任务销毁时的方法名。这个方法会在任务最后一次执行后被调用,通常用于释放资源。方法必须是无参数的。

这三个参数是@XxlJob注解的基本参数,用于定义任务的基本属性。

第四:最佳实践

使用Spring Boot和XXL-Job进行任务调度是一种强大的方式,但也有一些常见的错误和最佳实践,以下是一些建议,帮助读者避免这些错误并在实际项目中取得成功:

  1. 详细记录任务日志

    • 记录任务的执行日志是非常重要的,它可以帮助你追踪任务的执行情况,及时发现问题。确保在任务Handler中添加详细的日志信息。
  2. 参数校验

    • 在任务Handler中对传递的参数进行合法性校验,以避免不必要的异常和错误。
  3. 任务幂等性

    • 确保任务的逻辑是幂等的,即多次执行不会产生不同的结果。这对于任务失败后的重试非常重要。
  4. 失败处理

    • 配置任务的失败处理策略,包括重试次数、重试间隔等。这可以帮助应对临时问题,如网络故障或资源不足。
  5. 任务依赖

    • 如果任务之间存在依赖关系,确保在XXL-Job Admin中正确配置任务的依赖关系,以保证任务按照正确的顺序执行。
  6. 动态调度

    • 利用XXL-Job的动态调度功能来应对实时需求的变化,如动态调整任务触发时间、任务取消、任务延迟等。
  7. 监控与报警

    • 集成监控和报警系统,可以帮助你实时监测任务的执行情况,及时发现问题并采取措施。XXL-Job提供了与监控系统的集成支持。
  8. 版本管理

    • 使用版本控制工具(如Git)来管理任务Handler代码,以便跟踪任务逻辑的变化和恢复历史版本。
  9. 测试任务逻辑

    • 在开发任务Handler时进行充分的单元测试,确保任务逻辑的正确性。XXL-Job提供了一些测试工具,如JobLogger。
  10. 集群部署

    • 如果需要,部署XXL-Job执行器节点以提高任务的可用性和负载均衡。
  11. 版本升级

    • 定期关注XXL-Job的更新版本,确保使用最新的稳定版本,以获得最新的功能和 bug 修复。
  12. 安全性

    • 保护XXL-Job Admin的访问权限,防止未经授权的访问。不要在任务逻辑中存储敏感信息。
  13. 文档和培训

    • 提供适当的文档和培训,以便项目团队了解如何使用XXL-Job和任务调度最佳实践。

遵循这些最佳实践可以帮助你更好地使用Spring Boot和XXL-Job,确保任务调度系统的可靠性和稳定性。这对于生产环境中的任务调度至关重要。

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

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

相关文章

工厂干洗店洗鞋店系统,校园洗护小程序来了

洗鞋店小程序&#xff0c;干洗店软件&#xff0c;洗护行业小程序,上门取衣小程序,预约干洗小程序,校园干洗店小程序,工厂干洗店小程序,干洗店小程序开发&#xff0c;成品软件开发 洗衣工厂软件、功能强大&#xff01; 包含以下主要功能&#xff1a; * 用户选择洗护用品&#x…

Azure - 机器学习:创建机器学习所需资源,配置工作区

目录 一、Azure机器学习工作区与计算实例简要介绍工作区计算实例 二、创建工作区1. 登录到 Azure 机器学习工作室2. 选择“创建工作区”3. 提供以下信息来配置新工作区&#xff1a;4. 选择“创建”以创建工作区 三、创建计算实例四、工作室实战4.1 工作室快速导览4.2 从示例笔记…

CV算法工程师的LLM日志(1)微调技术——即插即用的neft-Tune【原理代码】

CV算法的LLM领域日志 目前维护的CV方向开源项目暂时暂停&#xff0c;原因是现在在做LLM方向的研发工作&#xff0c;所以需要时间消化前沿技术和总结经验&#xff0c;最近看到了一个非常简单的LLM训练Trick 分享一下&#xff0c;后续会逐渐把自己使用的一些LLM范式技术原理和代…

部分背包问题细节(贪心)

有一种情况是&#xff0c;背包可以把金币全部拿走&#xff1a; 如果num小于0则返回值

重症医学科常用评估量表汇总,建议收藏!

根据重症医学科医生的量表使用情况&#xff0c;笔者整理了10个重症医学科常用量表&#xff0c;可在线评测直接出结果&#xff0c;可转发使用&#xff0c;可生成二维码使用&#xff0c;可创建项目进行数据管理&#xff0c;有需要的小伙伴赶紧收藏&#xff01; 简明急性生理功能评…

Rocksdb LSM Tree Compaction策略

RocksDB读写简介 直接画图说明。这张图取自Flink PMC大佬Stefan Richter在Flink Forward 2018演讲的PPT&#xff0c;笔者重画了一下。 RocksDB的写缓存&#xff08;即LSM树的最低一级&#xff09;名为memtable&#xff0c;对应HBase的MemStore&#xff1b;读缓存名为block cac…

基于QT的图书管理系统

获取代码&#xff1a; 知识付费时代&#xff0c;低价有偿获取代码&#xff0c;请理解&#xff01; (1) 下载链接: 后发(2) 添加博主微信获取&#xff08;有偿&#xff09;,备注来源: mryang511688(3) 快速扫码咨询&#xff1a; 项目描述 技术&#xff1a;C、QT等 摘要&#…

(1)(1.8) Hondex声纳

文章目录 前言 1 推荐的硬件 2 连接和配置 3 参数说明 前言 Hondex HE-8S 是一款回声测深仪&#xff08;又称水下声纳&#xff09;&#xff0c;测深范围 100m&#xff0c;内置 GPS 和 NMEA 输出&#xff0c;可由 ArduPilot 使用。其他 Hondex 声纳也可以使用&#xff0c;但…

redis学习(三)——java整合redis

Jedis Jedis可以用于java连接redis数据库 新建一个maven项目&#xff0c;导入Jedis依赖 <dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>RELEASE</version><scope>test…

mcgsTpc屏与施耐德TM218PLC通讯说明

一、 硬件连接 1、PLC通讯接口说明&#xff1a; 2、通讯电缆图&#xff1a; 二、PLC设置 1. 配置端口&#xff1a; 双击串行线路—弹出右侧设置窗口---设置串口通讯参数 2. 添加MODBUS协议。 ① 右击串口线路&#xff0c;选择添加设备&#xff1a; ② 选择现场总线&#xf…

Studio One6.5中文版本更新下载

供所有 Studio One 6 和 Studio 用户下载&#xff0c;以下是部分改进&#xff01; Studio One 6.5 更新功能&#xff1a; 空间音频制作工作流程与杜比全景声集成 支持杜比全景声双耳耳机监听 字幕和功能铺增强功能 整合杜比全景声的空间音频制作工作流程 Studio One 6.5…

损失函数总结(三):BCELoss、CrossEntropyLoss

损失函数总结&#xff08;三&#xff09;&#xff1a;BCELoss、CrossEntropyLoss 1 引言2 损失函数2.1 BCELoss2.2 CrossEntropyLoss 3 总结 1 引言 在前面的文章中已经介绍了介绍了一系列损失函数 (L1Loss、MSELoss)。在这篇文章中&#xff0c;会接着上文提到的众多损失函数继…

关于路由转发

路由表的作用 路由表的作用&#xff1a;目标网络匹配路由表&#xff0c;从相应网络转发&#xff1b;不匹配路由表&#xff0c;丢弃或转发至默认路由器。 路由转发的原理 根据IP地址找到目标网络&#xff0c;由应路由器解封装查看目标网络是否可达&#xff0c;重新封装进行转…

什么是数据中心的测试负载?

数据中心的测试负载是指在数据中心环境中进行的负载测试&#xff0c;以评估数据中心的性能、可靠性和可扩展性。负载测试是通过模拟实际使用情况&#xff0c;向数据中心的系统和组件施加各种类型的负载&#xff0c;以确定其在不同负载条件下的表现和响应能力。 通过模拟高负载情…

GCE的安装和使用

GCE的安装和使用 GCE的安装使用1. GCE的安装2. GCE的使用补充&#xff1a;一个简单的R脚本——kmerpdf.R&#xff0c;用于绘制kmer的种类和数量分布图 GCE的安装使用 一个基因组评估软件。其他同类型软件Genomescope 1. GCE的安装 Github官网&#xff1a;https://github.com…

css-渐变色矩形

效果图&#xff1a; 代码&#xff1a; html: <!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"viewport" content"initial-scale1.0, user-scalableno" /><title></title><link …

一文讲解电源技术中专为准谐振转换器供电 高性能电流模式控制器NCP1380BDR2G

NCP1380BDR2G是一款高性能器件&#xff0c;旨在为准谐振转换器供电。该控制器基于专属的谷锁闭系统&#xff0c;可以在功率负载变轻时进行切换并降低开关频率。这样将产生稳定的运行&#xff0c;即使在漏极-源极谷中总是触发的开关事件下也是如此。此系统可在低至第 4 个谷的条…

Zip密码忘记了,如何破解密码?

Zip压缩包设置了密码&#xff0c;解压的时候就需要输入正确对密码才能顺利解压出文件&#xff0c;正常当我们解压文件或者删除密码的时候&#xff0c;虽然方法多&#xff0c;但是都需要输入正确的密码才能完成。忘记密码就无法进行操作。 那么&#xff0c;忘记了zip压缩包的密…

YOLOv5 添加 OTA,并使用 coco、CrowdHuman数据集进行训练。

YOLO-OTA 第一步&#xff1a;拉取 YOLOv5 的代码第二步&#xff1a;添加 ComputeLossOTA 函数第二步&#xff1a;修改 train 和 val 中损失函数为 ComputeLossOTA 函数1、在 train.py 中 首先添加 ComputeLossOTA 库。2、在 train.py 修改初始化的损失函数3、在 train.py 修改一…

.net 支付宝 应用网页验签

验证签名接口 /// <summary>/// 验证网关/// </summary>/// <returns></returns>[Route("gatewayVerify"), HttpPost, AllowAnonymous, NonUnify]public async Task<dynamic> gatewayVerify(){var Request App.HttpContext.Request;…