• 【分布式任务调度】(二)XXL-JOB执行器配置及定时任务的创建


    1. 概述

    在上一篇《XXL-JOB调度中心集群部署配置》中,我们已经得到了一个调度中心的集群,接下来只需要了解到如何配置调度器及创建定时任务就可以了。
    本文的主要内容包括:

    • 配置并启动调度器
    • 创建并执行定时任务

    2. 调度器配置

    第一次配置调度器,可以参考源码路径下的SpringBoot示例项目进行配置,也可以参考的官方文档的配置。
    调度器的配置非常简单,只需要3个步骤就可以完成配置。

    2.1.依赖及配置

    依赖包引入
    执行器只需要引入XXL-JOB的core包,我们可以在当前已存在的SpringBoot服务中引入,也可以创建一个新的服务来进行引入,现在部署的调度中心版本为2.3.1,执行器也配置为相同的版本。

    • maven配置:
    <dependency>
        <groupId>com.xuxueligroupId>
        <artifactId>xxl-job-coreartifactId>
        <version>2.3.1version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • gradle配置:
    implementation 'com.xuxueli:xxl-job-core:2.3.1'
    
    • 1

    properties配置
    properties文件的配置,官网已经有了详细的描述:

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

    我们可以把这个配置文件直接复制到项目中,需要注意修改下面几个位置:

    # 调度中心地址修改为集群的地址
    xxl.job.admin.addresses=http://ls.xxljob.cn/xxl-job-admin
    # 因为调度中心配置的是default_token,此处我们保持一致
    xxl.job.accessToken=default_token
    # 指定执行器名称,每个服务都应该有不同的执行器名称,同一个服务的不同集群节点的执行器名称应该相同
    xxl.job.executor.appname=my-simple-executor
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    properties的使用
    properties文件配置完成后,我们需要将这些配置使用起来,在SpringBoot中可以通过@Value注解将配置文件中的值注入到字段中,然后我们就可以使用这些字段,初始化XXL-JOB的执行器对象,把这个执行器对象交给Spring托管就可以了。
    代码配置可以查看xxl-job-executor-sample-springboot中的XxlJobConfig,在实际使用的时候可以直接把XxlJobConfig复制到自己的项目中去,也可以自行封装一个SpringBoot的starter包,在其他的项目中直接引入starter包进行使用,这里就不做赘述了。
    最终,会使用XxlJobSpringExecutor生成一个Bean注册到Spring中,这个就是当前服务节点中的执行器对象,执行器对象会充当指挥官的角色,由它来调用不同的定时任务。

    为了方便,代码直接放这儿了:

    @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;
        }
    
        /**
         * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
         *
         *      1、引入依赖:
         *          
         *             org.springframework.cloud
         *             spring-cloud-commons
         *             ${version}
         *         
         *
         *      2、配置文件,或者容器启动变量
         *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
         *
         *      3、获取IP
         *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
         */
    
    }
    
    • 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
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    2.2.任务实例

    我们需要注册一个Bean到Spring中,并使用@XxlJob告诉执行器哪个方法是需要进行调度的,代码如下:

    import com.cdwl.paybase.common.config.XxlJobConfig;
    import com.xxl.job.core.handler.annotation.XxlJob;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MyJob {
    
        private final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
    
        @XxlJob("mySimpleJob")
        public void mySimpleJob() {
            logger.info("执行自定义任务");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    注:当前的XXL-JOB是通过Http协议来进行通信的,需要依赖Tomcat,所以在需要引入web依赖。

    implementation 'org.springframework.boot:spring-boot-starter-web'
    
    • 1

    配置好后,我们就可以启动SpringBoot服务了,启动后就会往调度中心的数据库中,注册一个执行器实例。
    注册的数据存入到xxl_job_registry表中:
    在这里插入图片描述
    字段解释参考下面的执行器集群。

    执行器集群
    执行器也是支持集群的,只需要在properties文件中,将addressesappname配置为一样的就可以了。
    此外,如果是在同一台机器上启动的话,还需要修改端口xxl.job.executor.port=9999为其他的数值。
    启动第二个节点之后,注册数据如下:
    在这里插入图片描述

    • registry_key: 执行器节点中配置的appname,即执行器名称。
    • registry_value: 执行器节点暴露的ip和端口号。

    看到这个数据,不难猜到,registry_key是让调度中心用来获取执行器所有节点的请求地址的key,获取到请求地址后,就可以请求执行器的调度接口进行任务调度了。

    2.3.调度中心管理配置

    创建执行器

    在执行器的服务实例启动完毕之后,还需要在调度中心的管理系统中配置对应的执行器,以及任务信息。
    通过http://ls.xxljob.cn/xxl-job-admin打开管理平台,默认用户名、密码分别是admin123456,然后进行如下配置:
    在这里插入图片描述
    关于注册方式,如果选择手动录入,需要自行将执行器的ip地址填写到文本框中。
    如果选择的是自动注册,就会自动获取上面提到的xxl_job_registry表中的ip地址列表,这种方式可以动态的感知到执行器的上下线,是一种更加合适的方式。

    保存完成之后,就可以在列表中看到my-simple-executor这个执行器,点击查看就可以看到当前执行器的注册实例的ip地址啦。
    在这里插入图片描述
    需要注意的是:
    这里的地址列表是保存在执行器表xxl_job_group中的,如果在页面创建完成之后,Online机器地址没有值,可以等待30秒左右再进行查询,因为注册完成的执行器实例,每30秒会更新一次注册信息,这里涉及到执行器实例的探活,本篇暂时不提,会在后面的原理分析中补充。

    创建定时任务
    操作到这里之后,距离成功就只有一步之遥了,我们需要在调度中心的管理平台上,给刚刚创建的自定义执行器配置一个定时任务,关联到执行器实例中使用@XxlJob注解的方法。
    在这里插入图片描述
    在这里插入图片描述
    配置解释可以参考官方文档中的配置属性详细说明

    简单的说,这里的配置表示每5秒钟执行一次my-simple-executor执行器实例中的mySimleJob任务。
    保存后,将任务启动。
    在这里插入图片描述
    然后点击查询日志,可以看到,任务已经执行成功了。
    在这里插入图片描述
    至此,一个最简单的定时任务就已经完成啦。按照这个配置的流程,可以在生产环境中的任意一个SpringBoot服务上集成定时任务。

    3. 总结

    本篇讲解了在有了调度中心的基础上,如何配置执行器从而达到在服务中使用定时任务的过程。

    1. 在SpringBoot项目中引入xxl-core包。
    2. 编辑properties文件,并解析到字段中,然后使用这个配置初始化执行器。
    3. 编写定时任务方法,并使用@XxlJob注解,并配置任务名称。
    4. 在调度中心管理平台中,先创建执行器配置,有了执行器之后在对应的执行器分组下创建定时任务。

    启动定时任务,之后就可以查看定时任务的执行效果了。

  • 相关阅读:
    vue3 分屏 可拖拽分屏
    RocketMQ特性--Broker是如何存储事务消息的?
    为什么团队的自动化没有效果?
    线性代数相关笔记
    Mybatis-Plus-入门简介(2)
    Ros入门21讲
    Leecode刷题 383.赎金信——哈希表
    BIM → CIM,捷码赋能智慧城市多行业应用开发
    IDEA手动导入jar包到maven本地库
    (原创)【B4A】一步一步入门10:TabHost,标签页、标题带图标(控件篇06)
  • 原文地址:https://blog.csdn.net/qq_38249409/article/details/127456979