一、xxl-job简介

  xxl-job是一个开源的分布式定时任务框架,它可以与其他微服务组件一起构成微服务集群。它的调度中心(xxl-job)和执行器(自己的springboot项目中有@XxlJob("定时任务名称")的方法)是相互分离,分开部署的,两者通过HTTP协议进行通信。

  将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。 将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;

调度模块(调度中心):

  负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;

  支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。

执行模块(执行器):

  负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;接收“调度中心”的执行请求、终止请求和日志请求等。

Xxl-job项目地址: GitHub地址:GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB) Gitee地址:xxl-job: 一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

Xxl-job优点:

springboot调度任务等到上一次执行完成 springboot任务调度框架_定时任务

 View Code

二、Xxl-job使用

2.1. 下载项目
通过上面地址下载项目源码,用IDEA打开项目,配置好Maven,并刷新Maven加载项目相关依赖。

springboot调度任务等到上一次执行完成 springboot任务调度框架_spring_02

2.2. Install项目
  我们把项目install成maven依赖到本地maven仓库。防止后期我们把xxl-job-admin拿出来单独导入IDEA时,使用xxl-job-core这依赖时报错,因为阿里maven库是没有这个包的,要自己install一下。

springboot调度任务等到上一次执行完成 springboot任务调度框架_java_03

2.3 xxl-job-admin构建

  xxl-job-admin 本身就是一个 springboot 项目,将 xxl-job-admin 这个子项目从源代码中复制出来,使用 idea 打开,配置好 Maven,刷新Maven导入依赖(xxl-job-core等。上面执行 install 步骤后,这里刷新Maven就不会报错)。这个就是我们的定时任务管理器(调度中心),将项目中 application.properties 配置文件中的 server.port 改一个非8080的不常用的端口,然后将数据库连接信息改成 xxl-job 的实际数据库连接地址。然后将xxl-job-admin项目打成jar包,执行命令 java -jar xxl-job-admin-2.4.0-SNAPSHOT.jar 独立于自己的真实业务项目运行。线上环境 将数据库连接地址改为真实服务器地址、用户名、密码,再将 xxl-job-admin-2.4.0-SNAPSHOT.jar 放到线上环境执行即可。

【  创建xxl-job-admin数据库 -- 修改配置文件 --  构建 xxl-job-admin   -- 启动xxl-job-admin项目 -- 访问xxl-job-admin 】

springboot调度任务等到上一次执行完成 springboot任务调度框架_定时任务_04

springboot调度任务等到上一次执行完成 springboot任务调度框架_java_05

将xxl-job-admin-2.4.0-SNAPSHOT.jar 放到D盘,打开cmd在该目录执行java -jar xxl-job-admin-2.4.0-SNAPSHOT.jar ,启动xxl-job。

springboot调度任务等到上一次执行完成 springboot任务调度框架_开发语言_06

在浏览器访问 http://localhost:9090/xxl-job-admin ,用户名admin 密码123456
登录成功,此时没有任务运行。定时任务管理器已经运行成功,我们开始集成到自己的项目。

springboot调度任务等到上一次执行完成 springboot任务调度框架_jar_07

三、将xxl-job集成到我们的springboot项目

3.1 引入Maven依赖

springboot调度任务等到上一次执行完成 springboot任务调度框架_spring_08


<!-- SpringBoot集成Xxl-Job -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.3.0</version>
        </dependency>


springboot调度任务等到上一次执行完成 springboot任务调度框架_spring_09

springboot调度任务等到上一次执行完成 springboot任务调度框架_jar_10

3.2.编写配置文件

在我们的springboot项目的 application-dev.yml 配置文件中新增xxl-job配置信息。注意:如果 accessToken 不设置的话,最好把它注释掉,或者 输入xxl-job 默认的 default_token ,否则调用的时候容易引起获取不到token的报错。

springboot调度任务等到上一次执行完成 springboot任务调度框架_开发语言_11


# Xxl-Job分布式定时任务调度中心
xxl:
  job:
    admin:
      # 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。 
      addresses: http://localhost:9090/xxl-job-admin
      # addresses: http://192.168.110.2:9090/xxl-job-admin
    # 执行器通讯TOKEN [选填]:非空时启用 系统默认 default_token
    accessToken: default_token
    executor:
      # 执行器的应用名称
      appname: mls-xxl-job
      # 执行器注册 [选填]:优先使用该配置作为注册地址
      address: ""
      # 执行器IP [选填]:默认为空表示自动获取IP
      ip: ""
      # 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999
      port: 9999
      # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
      logpath: D:\Codes\logs      #logpath: /data/logs/mls/job
      # 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
      logretentiondays: 7

springboot调度任务等到上一次执行完成 springboot任务调度框架_spring_12

springboot调度任务等到上一次执行完成 springboot任务调度框架_定时任务_13

3.3 编写配置类

将 XxlJobConfig 配置类放入项目中的配置类文件夹下,此类可以不用修改。注意:如果上一个配置import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;

springboot调度任务等到上一次执行完成 springboot任务调度框架_jar_14


import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @ClassName: XxlJobConfig
 * @Description: xxl-job依赖配置
 * @author: 
 * @date: 2022年12月07日 08:37
 * @version: 1.0
 */
@Configuration  //是否开启xxl-job定时任务,注释掉 //@Configuration 则不开启定时任务
@Data
@Slf4j
public class XxlJobConfig {

    @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() {
        XxlJobHelper.log(">>>>>>>>>>> xxl-job config init.>>>>>>>>>>>");
        System.out.println("=============== 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;
    }
}

springboot调度任务等到上一次执行完成 springboot任务调度框架_定时任务_15

3.4 编写测试类

springboot调度任务等到上一次执行完成 springboot任务调度框架_jar_16


import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * @ClassName: XxlJobTest
 * @Description: XxlJobTest
 * @author: 
 * @date: 2022年12月07日 12:58
 * @version: 1.0
 */
@Slf4j
@Component
public class XxlJobTest {

    @XxlJob("xxlJobTest")
    public ReturnT<String> xxlJobTest(String date) {
//        log.info("---------xxlJobTest定时任务执行成功--------");
        System.out.println("---------xxlJobTest定时任务执行成功--------");
        return ReturnT.SUCCESS;
    }

}


springboot调度任务等到上一次执行完成 springboot任务调度框架_定时任务_15

3.5 启动项目

先启动调度中心(xxl-job-admin模块),再启动自己的springBoot服务(xxl-job-admin模块的端口已改为9090,所以本地在浏览器访问 http://localhost:9090/xxl-job-admin ,用户名admin 密码123456

springboot调度任务等到上一次执行完成 springboot任务调度框架_定时任务_18

3.6 任务调度中心,配置服务

3.6.1 执行器管理--新增执行器

springboot调度任务等到上一次执行完成 springboot任务调度框架_定时任务_19

springboot调度任务等到上一次执行完成 springboot任务调度框架_开发语言_20

3.6.2 任务管理--新增任务

springboot调度任务等到上一次执行完成 springboot任务调度框架_spring_21

3.6.3 任务管理--执行任务
测试可以点击“执行一次”,如果想一直运行,点击下拉的“启动”即可。至此,springboot 简单集成 xxl-job 已完成。

springboot调度任务等到上一次执行完成 springboot任务调度框架_jar_22

springboot调度任务等到上一次执行完成 springboot任务调度框架_jar_23