• XXL-JOB 分布式任务调度中心搭建


    简介

    XXL-JOB 是一个分布式任务调度平台,学习简单、轻量级、易扩展,并且开源。至今,XXL-JOB 已接入多家公司的线上产品线,接入场景如电商业务,O2O业务和大数据作业等,截止最新统计时间为止,XXL-JOB已接入的公司超过 500 家。
    那么现在就来搭建下 XXL-JOB。

    搭建

    拉取源码

    先从 Gitee 拉取源码,或者直接下载压缩包,然后打开后目录结构如下所示:
    在这里插入图片描述
    ● xxl-job-admin :xxl-job 调度中心平台,可视化界面
    ● xxl-job-core:xxl-job 项目的公共依赖
    ● xxl-job-executor-samples:任务执行器的示例
    ○ xxl-job-executor-sample-frameless:无框架管理任务执行器
    ○ xxl-job-executor-sample-springboot:SpringBoot 管理任务执行器

    初始化数据库

    由于 xxl-job 是中心式的调度平台,调度多个任务执行器来执行任务,调度中心通过 DB 的锁来报纸集群分布式调度的一致性,因此要先初始化数据库。而默认的 db.sql 已经提供给我们了。
    在这里插入图片描述
    在数据库中执行上述脚本即可。

    修改配置文件

    打开 xxl-job-admin 调度中心模块,修改 application.properties 配置文件,主要是修改端口,数据源等一些配置。
    说明如下:

    ### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    ### 报警邮箱
    spring.mail.host=smtp.qq.com
    spring.mail.port=25
    spring.mail.username=xxx@qq.com
    spring.mail.password=xxx
    spring.mail.properties.mail.smtp.auth=true
    spring.mail.properties.mail.smtp.starttls.enable=true
    spring.mail.properties.mail.smtp.starttls.required=true
    spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
    ### 调度中心通讯TOKEN [选填]:非空时启用;
    xxl.job.accessToken=
    ### 调度中心国际化配置 [必填]: 默认为 "zh_CN"/中文简体, 可选范围为 "zh_CN"/中文简体, "zh_TC"/中文繁体 and "en"/英文;
    xxl.job.i18n=zh_CN
    ## 调度线程池最大线程配置【必填】
    xxl.job.triggerpool.fast.max=200
    xxl.job.triggerpool.slow.max=100
    ### 调度中心日志表数据保存天数 [必填]:过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能;
    xxl.job.logretentiondays=30
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    部署项目并启动

    上述操作都完成后,可以进入到 xxl-job-admin 模块的 target 目录,启动该项目即可。
    调度中心的访问地址为: http://localhost:8080/xxl-job-admin 。
    在这里插入图片描述

    任务调度

    打开任务管理,选中默认的任务,然后操作下拉栏选择执行一次。
    在这里插入图片描述
    弹出的确认框直接保存即可。
    然后来到调度日志,可以看到我们刚刚执行的人物,操作下拉栏中选择执行日志,即可查看执行任务时的日志信息。
    在这里插入图片描述
    这个任务调用的就是 xxl-job-executor-sample-springboot 模块中 SampleXxlJob 类的 demoJobHandler() 方法。
    在这里插入图片描述

    自定义 xxl-job 任务

    在 xxl-job 中,每一个任务称为 JobHandler。xxl-job 支持基于方法的开发方式,使得每一个任务对应一个方法,更加的方便快捷,只需要在方法上加上 @XxlJob 注解即可。注解的格式如下:

    @XxlJob(value="自定义 jobhandler 名称", init = "JobHandler 初始化方法", destroy = "JobHandler 销毁方法")
    
    • 1

    这里我创建了一个 CustomerXxlJob 类,里面自定义了一个 JobHandler。

    package com.xxl.job.executor.service.jobhandler;
    
    import com.xxl.job.core.context.XxlJobHelper;
    import com.xxl.job.core.handler.annotation.XxlJob;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    /**
     * @author zxb 2022/8/4 10:59
     */
    @Component
    public class CustomerXxlJob {
    
        private static Logger logger = LoggerFactory.getLogger(CustomerXxlJob.class);
    
        public void init() {
            logger.info("init method invoke...");
        }
    
        @XxlJob(value = "customerJob", init = "init", destroy = "destroy")
        public void customerJob() {
            long jobId = XxlJobHelper.getJobId();
            XxlJobHelper.log("Hello my first XXL-JOB");
            logger.info("customerJob starting... job id : {}", jobId);
        }
    
        public void destroy() {
            logger.info("destroy method invoke...");
        }
    
    }
    
    • 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

    然后要去调度中心去添加我们自定义的任务。
    来到任务管理,单击新增,填写基本信息。
    在这里插入图片描述
    单击保存。
    然后我们可以在 IDE 中给我们自定义的方法打上断点。然后可以执行一次该任务。可以在调度日志中查看我们执行的结果。
    在这里插入图片描述
    至此, XXL-JOB 的基本搭建和任务的编写就完成了。

    项目中集成

    这里我将 xxl-job-admin 这个微服务打包放到我的服务器上了,这个调度中心是支持集群部署的,我这里就不搞集群了。

    导入 xxl-job-core 的依赖

    这里我在之前写的一个 boot 项目中集成 XXL-JOB,xxl-job-core 的版本是 2.3.0。

            <dependency>
                <groupId>com.xuxueligroupId>
                <artifactId>xxl-job-coreartifactId>
                <version>2.3.0version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    配置任务调度中心地址、任务执行器,编写对应配置类

    任务调度中心地址就是服务器上的地址。
    任务执行器是用来执行任务的,一般一个模块就用一个任务执行器就可以了。
    在 application.properties 配置文件中加如如下配置按需即可:

    server.port=9090
    ### 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
    xxl.job.admin.addresses=http://124.xxx.xxx.208:8080/xxl-job-admin
    ### 执行器通讯TOKEN [选填]:非空时启用;填 default_token 就行
    xxl.job.accessToken=default_token
    ### 任务执行器的名称
    xxl.job.executor.appname=zxb-executor
    ### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”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=/data/applogs/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
    • 17

    然后我们需要写一个配置类来读取 application.properties 中的属性。

    package com.zxb.xxl_customer.config;
    
    import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @author zxb 2022/8/4 20:18
     */
    @Configuration
    public class XxlJobConfig {
        private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
    
        @Value("${xxl.job.admin.addresses}")
        private String adminAddresses;
    
        @Value("${xxl.job.accessToken}")
        private String accessToken;
    
        @Value("${xxl.job.executor.appname}")
        private String appname;
    
        @Value("${xxl.job.executor.address}")
        private String address;
    
        @Value("${xxl.job.executor.ip}")
        private String ip;
    
        @Value("${xxl.job.executor.port}")
        private int port;
    
        @Value("${xxl.job.executor.logpath}")
        private String logPath;
    
        @Value("${xxl.job.executor.logretentiondays}")
        private int logRetentionDays;
    
    
        @Bean
        public XxlJobSpringExecutor xxlJobExecutor() {
            logger.info(">>>>>>>>>>> xxl-job config init.");
            XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
            xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
            xxlJobSpringExecutor.setAppname(appname);
             xxlJobSpringExecutor.setAddress(address);
             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
    • 53
    • 54
    • 55
    • 56
    • 57

    在任务调度中心进行配置

    来到执行器管理,添加我们刚才在配置文件中配置的任务执行器的名称。
    在这里插入图片描述
    在这里插入图片描述
    执行器属性说明:

    AppName: 就是我们在 application.properties 中 xxl.job.executor.appname 的值
    名称: 执行器的名称, 因为AppName限制字母数字等组成,可读性不强, 名称为了提高执行器的可读性;
    注册方式:调度中心获取执行器地址的方式;
        自动注册:执行器自动进行执行器注册,调度中心通过底层注册表可以动态发现执行器机器地址;
        手动录入:人工手动录入执行器的地址信息,多地址逗号分隔,供调度中心使用;
    机器地址:"注册方式"为"手动录入"时有效,支持人工维护执行器的地址信息;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    配置任务

    先在代码层面创建一个任务:

    package com.zxb.es_springboot.job;
    
    import com.xxl.job.core.context.XxlJobHelper;
    import com.xxl.job.core.handler.annotation.XxlJob;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    /**
     * @author zxb 2022/8/4 16:11
     */
    @Component
    public class CustomerXxlJob {
    
        private static Logger logger = LoggerFactory.getLogger(CustomerXxlJob.class);
    
        @XxlJob(value = "testJob")
        public void testJob() {
            logger.info("job begin, job id : {}", XxlJobHelper.getJobId());
            String jobParam = XxlJobHelper.getJobParam();
            System.out.println(jobParam);
            XxlJobHelper.log("job begin");
            while (true) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                XxlJobHelper.log("running...");
                if ("stop".equals(jobParam)) {
                    break;
                }
            }
            XxlJobHelper.log("job end");
        }
    }
    
    • 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

    然后在任务管理界面配置这个任务,并指定执行器。
    在这里插入图片描述
    保存即可。

    测试

    接下来进行测试。一定要选中自己定义的执行器,不要用示例执行器了。
    在这里插入图片描述成功!
    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    分布式锁中-基于Zookeeper的实现是怎样
    LeetCode 54. 螺旋矩阵
    利用cmake工具生成VisualStudio工程文件
    ID生成器代码重构问题
    Vuex3使用教程(待续)
    Observability:集群监控 (一) - Elastic Stack 8.x
    labview 写入文本到word报表(标签方法)
    Spark/Hive 行列转换
    ArcGIS基础:二维点转三维点 二维线转三维线
    【LeetCode 力扣】1.两数之和 Java实现 哈希表
  • 原文地址:https://blog.csdn.net/weixin_44061521/article/details/126170483