分布式任务调度XXL-Job

187 阅读3分钟

一、本地部署分布式任务调度xxl-job

1.1 拉取xxl-job源码

gitee地址:gitee.com/xuxueli0323… 拉取下来即可

1.2 创建xxl_job数据库

运行sql:

image.png

image.png

1.3 修改默认配置文件

将数据库配置属性修改为自己的

image.png

1.4 运行测试

启动XxlJobAdminApplication服务,能正常进入证明部署成功http://localhost:9000/xxl-job-admin/jobinfo默认admin,123456为用户名密码

image.png

二、docker部署分布式任务调度xxl-job

2.1 拉取镜像

docker pull xuxueli/xxl-job-admin:2.4.0

2.2 启动镜像

docker run  -d \
        -p 8088:8088\
        --restart=always\
        -v /tool/xxl-job/logs:/data/applogs \
        -v /tool/xxl-job/application.properties:/xxl-job/xxl-job-admin/src/main/resources/application.properties \
        -e PARAMS="--server.port=8088\
        --spring.datasource.url=jdbc:mysql://117.72.118.73:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai \
        --spring.datasource.username=root \
        --spring.datasource.password=ssm030927" \
        --name xxl-job-admin  \
xuxueli/xxl-job-admin:2.4.0

注意:

  • 云服务器开放8088端口
  • 按照上面的方式提前创建好xxl_job数据库

2.3 测试

image.png

三、SpringBoot集成xxl-job

官方提供了SpringBoot集成示例的配置,config,及handle等,我们按照这些方式引入到自己项目中

image.png

3.1 引入依赖

在domain层引入xxl-job相关依赖,appliaction-job层只是入口层

<dependency><!--xxl-job-->
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency> <!--可以读取其他(未引入)模块的方法,类,配置属性等-->
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.27</version>
</dependency>

3.2 配置文件

要保证调度中心能够访问到执行器address,当任务调度中心本地部署时,执行器ip可写127.0.0.1;但当调度中心部署在云服务器时,执行器的本地ip要进行内网穿透,确保调度中心可以访问到。

xxl:
  job:
    admin:
      address: http://117.72.118.73:8088/xxl-job-admin #指定调度中心的地址
    accessToken: default_token #调度中心和执行器之间的通信令牌,用于安全校验
    executor:
      appName: jc-club-subject #执行器名称(执行器的唯一标识,调度中心通过这个名称来识别和管理执行器)
      address: http://1ky01gk882029.vicp.fun:48482 #执行器的地址。(如果未配置,调度中心会通过 ip 和 port 自动生成执行器的地址。)
      ip: 127.0.0.1
      port: 9999 #执行器监听的端口号,调度中心通过这个端口与执行器通信
      logPath: /data/applogs/xxl-job/jobhandler
      logRetentionDays: 30 #任务日志的保留天数

3.3 config配置类

XxlJobConfig配置类可直接复制引入,注意与yml配置属性的名称一致

package com.ssm.subject.domain.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;

/**
 * xxl-job config
 *
 * @author xuxueli 2017-04-28
 */
@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @Value("${xxl.job.admin.address}")
    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、引入依赖:
     *          <dependency>
     *             <groupId>org.springframework.cloud</groupId>
     *             <artifactId>spring-cloud-commons</artifactId>
     *             <version>${version}</version>
     *         </dependency>
     *
     *      2、配置文件,或者容器启动变量
     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
     *
     *      3、获取IP
     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
     */


}

3.4 任务开发

可按照示例中简单任务示例进行开发

XxlJobHelper.log打印的日志会在任务调度中心显示

@Component
@Log4j2
public class SyncLikedJob {

    @XxlJob("syncLikedJobHandler")
    public void demoJobHandler() throws Exception {
        XxlJobHelper.log("syncLikedJobHandler.start"); 
        try {
            log.info("123456");
        } catch (Exception e) {
            XxlJobHelper.log("syncLikedJobHandler.error" + e.getMessage());
        }
    }

}

3.5 测试

1.首先按照yml文件中配置的executor.appName来创建执行器,项目启动后显示注册节点证明成功

image.png

2.创建定时任务,jobHandler与@XxlJob注解中的名称保持一致

image.png

3.可先执行一次检验结果,再启动定时任务

image.png

image.png