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


    前言

    “在现代应用程序中,定时任务是不可或缺的一部分。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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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"/>
    
    • 1
    • 2

    4️⃣:访问http://127.0.0.1:9998/xxl-job-admin,这里端口是你上面配置的,输入默认的账号密码admin/123456

    在这里插入图片描述

    🔚:到这里调度中心就配置好了

    配置执行器

    这里其实刚刚拉取的项目下就涵盖了执行器,包括无框架的以及springboot框架的

    在这里插入图片描述

    自己的项目如何整合

    maven依赖
    <dependency>
      <groupId>com.xuxueligroupId>
      <artifactId>xxl-job-coreartifactId>
      <version>2.4.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    执行器组件配置
    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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    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.");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    拉取下来的代码中/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,确保任务调度系统的可靠性和稳定性。这对于生产环境中的任务调度至关重要。

  • 相关阅读:
    Packet Tracer - 配置 IPv4 和 IPv6 接口
    【爬虫+情感判定+Top10高频词+词云图】“刘畊宏“热门弹幕python舆情分析
    反射读取数组导出
    【好书推荐】面向初学者的Go语言学习手册 | Go语言极简一本通
    pytorch中的hook机制register_forward_hook
    简单说说ConcurrentHashMap的结构和实现
    渗透测试-sql注入漏洞
    (C语言)文件操作
    OpenWrt之opkg详解
    Network: use `--host` to expose
  • 原文地址:https://blog.csdn.net/Mrxiao_bo/article/details/134026412