相关推荐recommended
Spring Boot整合 xxl-job
作者:mmseoamin日期:2024-01-21

目录

1. 介绍

2. SpringBoot整合xxl-job

2.1. 配置数据库

2.2. 运行调动中心

2.3. 整合业务服务

2.3.1. 引入maven依赖

2.3.2. 创建业务服务配置类

2.3.3. 创建定时任务


1. 介绍

xxl-job是一个分布式定时器任务派遣服务,这个项目主要有以下三部分组成 : 

  • xxl-job-admin: 调动中心,主要是提供任务管理平台的页面,需要把该模块单独打包作为一个服务部署,定时器再执行时,是通过该服务去调用我们的业务服务完成任务执行。
  • xxl-job-core:  公共依赖模块,在整合业务服务的时候,需要引入该依赖。
  • xxl-job-executor-samples:官方提供的demo。

Spring Boot整合 xxl-job,第1张

2. SpringBoot整合xxl-job

2.1. 配置数据库

点击 访问gitee获取该项目,在 /doc/db/tables_xxl_job.sql的路径中有SQL文件,需要将他导入到你自己的MySQL中。

Spring Boot整合 xxl-job,第2张

表介绍: 

Spring Boot整合 xxl-job,第3张

2.2. 运行调动中心

修改  xxl-job-admin 模块 application.properties 的配置信息。

修改MySQL为你数据库的真实信息 

Spring Boot整合 xxl-job,第4张

 修改邮箱服务配置(可选非必须)Spring Boot整合 xxl-job,第5张

以上配置都修改完成后,运行 xxl-job-admin 这个服务,上面说过它是一个调度中心,主要是提供任务管理平台的页面。所以当你的业务服务部署了,这个模块也要作为一个服务单独部署,这样才可以管理你业务中定时任务。

2.3. 整合业务服务

接下来整合我们自己的业务服务,xxl-job-executor-sample-springboot 这个模块是官方提供的整合demo 模块,可以参考它整合自己的业务。

Spring Boot整合 xxl-job,第6张

2.3.1. 引入maven依赖

     
        
            com.xuxueli
            xxl-job-core
            2.4.0
        

2.3.2. 创建业务服务配置类

注意:一定要确保你的 业务服务 和 xxl-job-admin 这个服务连接的是同一个数据库

application.properties配置

### 调度中心的地址 ,就是 xxl-job-admin 这个服务的地址
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### token (ke为空), 要和xxl-job-admin 中的accessToken统一
xxl.job.accessToken=default_token
### 执行器名称,可自定义
xxl.job.executor.appname=xxl-job-executor-sample
### 会将该地址注册到调度中心,调度中心会用该地址调度任务, 可为空默认就是 ip:port , 端口不可以和业务端口重复
xxl.job.executor.address=
### 可为空,默认获取本机ip
xxl.job.executor.ip=
xxl.job.executor.port=9999
### 运行日志所保存的路径
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 日志存放时间
xxl.job.executor.logretentiondays=30
创建:FrameLessXxlJobConfig 配置类
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.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * xxl-job config
 *
 * @author yazb
 */
@Configuration
public class FrameLessXxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(FrameLessXxlJobConfig.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();
     */
}

2.3.3. 创建定时任务

创建一个测试任务

2.3.3.1:bean模式任务

import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;
/**
 * @author yazb
 * 测试
 */
@Component
public class TestTask {
    @XxlJob("hello")
    public void demoJobHandler() throws Exception {
        System.out.println("hello---->xxl-job");
        // default success
    }
}

访问 xxl-job-admin 这个服务,在页面中运行定时任务。

用户:admin

密码:123456

Spring Boot整合 xxl-job,第7张

 创建定时任务Spring Boot整合 xxl-job,第8张

运行定时任务

Spring Boot整合 xxl-job,第9张

Spring Boot整合 xxl-job,第10张 

2.3.3.2:分片广播任务模式

分片广播模式,用来运行创建集群环境中的定时任务,所以需要我们再创建一个服务测试。

分片广播模式,会同时运行你集群中所有节点服务中定时任务。要想保证避免任务重复执行。可以采用 单机路由策略(如:第一台、一致性哈希)” + “阻塞策略(如:单机串行、丢弃后续调度)” 来规避,最终避免任务重复执行。

已经注册到调度中心的服务 

Spring Boot整合 xxl-job,第11张

创建分布式广播任务

Spring Boot整合 xxl-job,第12张

  /**
     * 2、分片广播任务
     */
    @XxlJob("shardingJobHandler")
    public void shardingJobHandler() throws Exception {
        // 分片参数
        int shardIndex = XxlJobHelper.getShardIndex();
        int shardTotal = XxlJobHelper.getShardTotal();
        XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);
        System.out.println("测试服务 9998-----》");
    }

Spring Boot整合 xxl-job,第13张