当前位置:网站首页>XXL-JOB 分布式任务调度中心搭建

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

2022-08-11 07:05:00 血莲丹

简介

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
[email protected]
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

部署项目并启动

上述操作都完成后,可以进入到 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 销毁方法")

这里我创建了一个 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...");
    }

}

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

项目中集成

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

导入 xxl-job-core 的依赖

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

        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.3.0</version>
        </dependency>

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

任务调度中心地址就是服务器上的地址。
任务执行器是用来执行任务的,一般一个模块就用一个任务执行器就可以了。
在 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

然后我们需要写一个配置类来读取 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;
    }
}

在任务调度中心进行配置

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

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

配置任务

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

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");
    }
}

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

测试

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

在这里插入图片描述

原网站

版权声明
本文为[血莲丹]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_44061521/article/details/126170483