【xxl-job】入门教学-调度任务可视化管理中间件搭建与使用

一、关于XXL-JOB

1. XXL-JOB介绍

XXL-JOB是由许雪里老师团队开发的一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。其主要的作用为美化以及管理我们系统中存在的大量定时调度任务,为这些调度任务提供一个可视化的管理平台(例如手动触发、传参触发、定时触发等功能)。该调度平台解决方案适用多种应用场景,例如:电商领域中,零点发放优惠卷、会员权益等定时调度任务;以及大数据平台中定时采集传输数据等需求。

2. XXL-JOB下载

这里使用的XXL-JOB版本为最新的[2.3.0正式版本]码云地址

二、XXL-JOB中间件搭建

1. 模块介绍

当我们将项目在IDEA中打开之后,将看到以下几个模块,下面将对这几个模块一一做介绍。

1. doc
该目录主要存放xxl-job静态资源以及db数据结构与数据
2. xxl-job-admin
该模块为xxl-job调度任务平台源码,启动后即可进入xxl-job后台管理系统界面进行任务配置。
3. xxl-job-core
该模块为xxl-job核心依赖包
4. xxl-job-executor-samples
该模块下存放着xxl-job执行器(客户端)的几个小demo案例,供我们模仿以及参考如何将我们系统与xxl-job调度平台对接。

2. xxl-job调度任务平台启动

  1. 首先需要doc目录中,我们刚刚所说到的db目录下的数据库表结构以及表数据导入数据库中,由于官方xxl-job使用的是mysql数据库,所以不做改造的情况下仅仅只支持mysql数据库(其他数据源的话,等我有时间看看怎么修改调试完后再补充)
  2. 将db文件导入完数据库之后,接下来需要修改如下配置文件
    在这里插入图片描述
    修改数据库连接相关参数:
    spring.datasource.username=rootspring.datasource.password=密码

配置由于调度任务异常时,报警的邮箱信息(选填),填写你邮箱的相关信息,如果不清楚请参考这位老哥的SpringBoot集成邮件服务
在这里插入图片描述
3. 修改完配置之后,则可以启动服务,待服务启动完成之后,在浏览器中输入http://127.0.0.1:8080/xxl-job-admin/toLogin,初始账号密码:admin:123456
在这里插入图片描述
在这里插入图片描述
当我们能够看到这样的界面则代表xxl-job调度平台搭建已经成功,接下来则是执行器(可以理解为我们系统中的调度任务)的搭建了。

3. XXL-JOB执行器搭建

xxl-job的执行原理其实可以理解为,我们在自己的项目中写完一个定时任务后,将以前触发定时任务的Schedule注解交由xxl-job调度平台管理,而xxl-job调度平台内部则由rpc远程调用我们配置的执行器信息以及任务的关联,找到对应的执行器中的任务,去启动并且接收任务运行后返回的结果;
所以这里对于xxl-job执行器的搭建,第一步则需要引入对应的xxl-job-core核心包;

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

引入包之后,则在项目的配置文件中进行所需参数的配置

# xxl-job
xxl:
  job:
    admin:
      # 调度中心部署根地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;为我们刚刚搭建的xxl-job调度平台IP:PROT
      addresses: http://IP:PORT/xxl-job-admin
    executor:
      # 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册,这里虽然说是选填,但是建议还是填会好点,方便执行器的管理以及可以开启自动注册功能,所填的值由自己定义
      appname: jsxmall-admin
      # 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
      ip:
      # 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
      address:
      # 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
      port: 0
      # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径
      logpath: logs/jobhandler
      # 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
      logretentiondays: 30
    # 执行器通讯TOKEN [选填]:非空时启用;(如果xxl-job平台配置了,则这里配置与平台一致即可)
    accessToken:

配置完信息之后,则需要将执行器注册到xxl-job平台

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 执行器配置信息
 *
 * @author: tuxusheng
 * @create-time 2021-12-29 11:44
 **/
@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;
    }

}

接下来编写调度任务(业务逻辑)

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;

/**
 * 语音机器人xxl-job定时任务 Bean模式,一个方法为一个任务 1、在Spring Bean实例中,开发Job方法,方式格式要求为 "public
 * ReturnT<String> execute(String param)" 2、为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称",
 * init = "JobHandler初始化方法", destroy =
 * "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。 3、执行日志:需要通过 "XxlJobLogger.log"
 * 打印执行日志;
 *
 * @author: tuxusheng
 * @create-time 2021-12-29 12:17
 **/
@Component
@Slf4j
public class VoiceRobotHandler {

    /**
     * 定时外呼接口(这里需要注意,传入的参数只支持String类型),注意这个xxlJob注解的值,后边会需要到调度平台进行任务的注册。
     * @param phone 
     * @return 成功、失败
     */
    @XxlJob("calloutInterfaceHandle")
    public ReturnT<String> calloutInterfaceHandle(String phone) {
        log.info("[xxl-job] 外呼请求调度任务开始,参数={}", phone);
        // 业务逻辑
        log.info("[xxl-job] 外呼请求调度任务结束,参数={}", phone);
   
       return ReturnT.SUCCESS;
    }

}

当我们完成上边的执行器搭建后,启动执行器所在项目应用。

4. 在xxl-job调度平台界面上执行器以及调度任务配置

4.1 执行器配置

登录xxl-job调度任务平台
在这里插入图片描述
AppName:填写我们刚刚执行器配置文件,配置的appname属性的值
名称:配置执行器的名称,方便在平台上管理
排序:默认写1
注册方式
手动录入:填写执行器所在项目的IP:PROT
自动录入:xxl-job会根据AppName配置的名字,去匹配注册到平台上的执行器,自动获取其IP:PROT

4.2 任务配置

在这里插入图片描述
执行器:选择我们刚刚在平台上配置的执行器
cron:代表调度周期
运行模式:由于我们执行器是以Bean的方式运行的,所以这里选择Bean模式
JobHandle:则是我们执行器项目中,@XxlJob(value)注解中的填写值
其余信息自行配置即可,随后点击保存,到这里我们的调度任务则配置成功了。

4.3 运行调度任务

在这里插入图片描述
这里需要注意的是,我们要选择对应的执行器(很重要),因为系统已经给了一个demo的执行器了,如果选错的话,任务是调度不成功的。当我们选择完执行器后,则可以选择任务后边的操作,进行任务的执行。

三. 常见问题解决

1. 版本问题

需要注意的是,xxl-job在开发迭代的过程中有很多的版本,而服务端的版本与执行器中的xxl-job-core包版本应该尽量保持一致(不同版本的包,差别会非常的大),会导致任务的调度执行中出现各种rpc远程调用问题,如果出现这个问题则为版本不对导致的。

2. xxl-job调度平台表结构问题

如果当我们对调度平台进行升级时,需要考虑升级的版本中的表结构与现有表结构是否相同,如果不同则需要连同表结构一起升级后,对旧的数据进行迁移,不然任务的调度将会出现异常。

四. 总结

这算是自己第一篇写的比较全的技术流水文章(第一次尝试自己排版),其实自己对于xxl-job也不算特别熟悉,只不过是这次项目中所写的需求刚好有定时任务处理业务逻辑这种需要,于是在开发组长的建议下,调研了解以及搭建了这个框架引入项目,中途也遇到了特别多的问题,版本问题则是困扰我时间最久的,于是就尝试将这一段记录形成文档,希望能帮到有需要的同学,如果有问题的话(我写到的与没写到的),也希望各位大佬能够指正或者提出,一起学习一起进步。后面我可能将更深一层的研究xxl-job框架,以及了解其执行的原理等,如果有时间也会整理成文档分享出来。有问题欢迎提问!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值