xxl-job 定时任务的调研及学习

发布时间 2023-07-28 17:22:49作者: 译林

xxl-job 定时任务官网

xxl-job springboot 整合资料参考

一、xxl-job简介

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

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

调度模块(调度中心):

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

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

执行模块(执行器):

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

Xxl-job项目地址:

  GitHub地址:https://github.com/xuxueli/xxl-job
  Gitee地址:https://gitee.com/xuxueli0323/xxl-job

Xxl-job优点:

、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;
、调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA;
、执行器HA(分布式):任务分布式执行,任务”执行器”支持集群部署,可保证任务执行HA;
、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址;
、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度;
、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务;
、任务失败重试:支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;其中分片任务支持分片粒度的失败重试;
、任务失败告警;默认提供邮件方式失败告警,同时预留扩展接口,可方便的扩展短信、钉钉等告警方式;
、任务进度监控:支持实时监控任务进度;
、Rolling实时日志:支持在线查看调度结果,并且支持以Rolling方式实时查看执行器输出的完整的执行日志;
、自定义任务参数:支持在线配置调度任务入参,即时生效;
、数据加密:调度中心和执行器之间的通讯进行数据加密,提升调度信息安全性;
、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件;
View Code

二、Xxl-job使用

2.1. 下载项目

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

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

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 

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

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

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

3.1 引入Maven依赖

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

3.2.编写配置文件

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

# 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

3.3 编写配置类

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

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

3.4 编写测试类

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

}

3.5 启动项目

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

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

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

 3.6.2 任务管理--新增任务

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