XXL-Job

概述

XXL-Job是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。

调度中心和执行器
在这里插入图片描述

快速入门

启动调度中心

(1)下载源码
gitee下载地址

(2)下载完成后解压
在这里插入图片描述
(3)执行sql脚本
在目录doc/db/下有一个脚本文件,执行这个脚本创建数据库和表。调度中心运行需要这些表。
在这里插入图片描述
(4)编译XXL-Job源码
使用IDEA将解压的XXL-Job项目导入进去
在这里插入图片描述
xxl-job-admin就是调度中心的项目。
(5)修改配置文件
修改数据库连接

### xxl-job, datasource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

修改邮件设置(可选)

### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.from=xxx@qq.com
spring.mail.password=xxx

(6)启动xxl-job-admin
运行xxl-job-admin项目,启动完成后在浏览器访问即可进入任务调度中心的图形化界面。
默认用户名密码是adming 123456
在这里插入图片描述

创建执行器模块

(1)新建SpringBoot项目
新创建一个SpringBoot项目作为我们的执行器模块。
在这里插入图片描述
(2)添加依赖

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

版本号根据自己的版本选择
(3)配置文件

server.port=8088
### 调度中心部署根地址 :如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=default_token
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-myexecutor
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=http://127.0.0.1:9999/
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=127.0.0.1
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=4

(4)创建配置类

@Configuration
public class XxlJobConfig {
    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;
    @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.accessToken}")
    private String accessToken;
    @Value("${xxl.job.executor.logpath}")
    private String logPath;
    @Value("${xxl.job.executor.port}")
    private int port;
    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;
    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        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;
    }
}

(5)创建一个执行器方法

@Component
public class HelloWorldExecutor {

    /**
     * 创建一个执行器。并指定初始化和销毁方法(可选)
     */
    @XxlJob(value = "sayHello",init = "initMethod",destroy = "destroyMethod")
    public void say(){
        System.out.println("Hello World!");
    }

    public void initMethod(){
        System.out.println("执行器初始化。。。");
    }
    public void destroyMethod(){
        System.out.println("执行器销毁。。。");
    }
}

创建执行任务

先启动调度中心,然后启动执行器项目。
在这里插入图片描述
点击执行器管理->新增,将创建的执行器方法添加进来
在这里插入图片描述
点击任务管理,点击新增,选择相应的执行器和Cron设置执行器的执行策略。JobHandler的值就是注解@XxlJob内的值。
在这里插入图片描述
点击保存后任务就会在列表中显示,选择启动。
在这里插入图片描述
启动后就会按照策略执行我们定义的执行器方法。
在这里插入图片描述
再次操作可以停止
在这里插入图片描述

GLUE运行模式

在添加任务时,有个运行模式的设置,默认是BEAN,就是我们使用@XxlJob注解的方式,然后将bean交给Spring管理。
在这里插入图片描述
GLUE模式的任务将会以源码方式维护在调度中心,支持通过web ide在线更新。
GLUE模式(java)运行模式的任务实际是一段继承自IJobHandler的java类代码,它在执行器项目中运行,可以使用@Resource/@Autowire注入执行器里其他的服务。
使用GLUE模式我们可以不对项目中的代码做任何修改也可以执行任务。

需求:在不使用@XxlJob注解的情况下,创建一个任务,每秒执行一次sayHello()方法。

@Service
public class HelloService {

    public void sayHello(){
        System.out.println("Hello");
    }

    public void sayBye(){
        System.out.println("Goodbye");
    }
}

步骤:
(1)启动任务调度中心
(2)启动执行器的服务,执行器注册进调度中心
(3)创建任务,选择GLUE模式
在这里插入图片描述
(4)任务创建成功后,进入glue ide编辑要执行的逻辑
在这里插入图片描述
(5)编辑任务执行的逻辑
在这里插入图片描述
(6)保存,输入版本描述,版本可以进行回退。
在这里插入图片描述
(7)最后一步,启动任务即可,任务执行结果如下。
在这里插入图片描述

执行器集群

执行器集群可以选择路由策略设置任务调度的策略。默认是第一个,也可以选择轮询等其他策略。
在这里插入图片描述
路由策略介绍:

  • 第一个:固定选择第一个机器
  • 最后一个:固定选择最后一个机器
  • 轮询:依次选择在线的机器发起调度
  • 随机:随机选择在线的机器
  • 一致性HASH:每个人物按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上
  • 最不经常使用:使用频率最低的机器优先被选择
  • 最近最久未使用:最久未被使用的机器优先被选择
  • 故障转移:按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度
  • 忙碌转移:按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度
  • 分片广播:

分片广播
分片广播适用于当一个任务很大很费时的时候,可以同时启动多个执行器共同执行该任务。
多个执行器将任务拆分执行,我们可以使用XxlJobHelper类获取如下两个参数用于设计将任务合理拆分:

  • 分片总数:总过有多少执行器用于分片(执行器数量)
  • 当前分片索引:当前执行器的分片索引,比如当分片总数为3时,3个执行器的分片索引分别为0、1、2。
//获取分片总数
int shardTotal = XxlJobHelper.getShardTotal();
//获取当前执行器的分片索引
int shardIndex = XxlJobHelper.getShardIndex();

需求:向id为1到10000的用户发送祝福短信。
如果我们只使用一个执行器执行该任务,那将会花费较长的时间,如果使用分片广播的模式,可以使用如下逻辑拆分任务,让多个执行器共同执行这个任务:

  1. 获取分片总数t和当前分片索引i。
  2. 当用户的id对分片总数取余等于当前执行器的分片索引时,则使用该执行器给该用户发送祝福短信(id%t==i)

注:分片广播模式会同时启动多个集群中的执行器执行任务。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值