XXL-JOB任务分片

2023-10-30

任务类型

  • 单个任务:一个任务实例便可完成

    • 单机单任务:单机模式下任何路由模式都只有一个实例执行

    • 集群单任务:由路由策略(广播模式除外)选择其中一个实例完成

  • 分片任务:集群部署,每个实例都同时执行一部分数据。分片方式:取模分片,范围分片

    • 单机多任务分片:单机模式下,创建同类型任务多个任务计划,手工分片数据作为参数

    • 集群任务分片:只有广播模式会通知所有实例都会运行,每个节点取模执行任务

任务配置

路由策略

策略 参数值 详细含义
第一个 FIRST 固定选择第一个机器
最后一个 LAST 固定选择最后一个机器
轮询 ROUND 依次选择执行
随机 RANDOM 随机选择在线的机器
一致性HASH CONSISTENT_HASH 每个人物按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上
最不经常使用 LEAST_FREQUENTLY_USED 使用频率最低的机器优先被选择
最近最久未使用 LEAST_RECENTLY_USED 最久未使用的机器优先被选择
故障转义 FAILOVER 按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度
忙碌转义 BUSYOVER 按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定位目标执行器并发起调度
分片广播 SHARDING_BROADCAST 广播触发对应集群中所有机器执行一次任务,同事系统自动传递分片参数,可根据分片参数开发分片任务

子任务ID:

当有任务需要相互依赖时使用,比如在对账业务里,下载对账文件任务成功之后,才开始对账。那么,可以把这几个任务当成一个大任务来串行处理,即在一个任务的末尾触发另一个任务。

如果我们需要在本任务执行结束并且执行成功的时候触发另外一个任务,那么就可以把另外的任务作为本任务的子任务运行,就只需要在本任务里填入另外一个任务的jobId即可(可以在任务列表查看JobId)

阻塞处理策略:

策略 参数值 含义
单机串行,默认 SERIAL_EXECUTION 调度请求进入单机执行器后,调度请求进入FIFO
丢弃后续调度 DISCARD_LATER 调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败
覆盖之前调度 COVER_EARLY 调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本次调度任务

单个任务和集群任务

@Component
public class SimpleJobHandler {

    @XxlJob(value ="simpleJobHandler" )
    public ReturnT<String> execute(String param) throws InterruptedException {

        IntStream.rangeClosed(1,20).forEach(index->{
            XxlJobLogger.log("simpleJobHandler>>"+index);
        });
        //官方文档说 如果任务超时 是采用interrupt机制打断子线程的,因此需要将InterruptedException 向上抛出
        //不能catch,否则任务超时后 任务还会被正常执行完
        Thread.sleep(ThreadLocalRandom.current().nextInt(10000));

        //任务超时后 这句日志不会被打印出来:xxl-job任务需用XxlJobLogger输出日志
        XxlJobLogger.log("执行完毕");

        return ReturnT.SUCCESS;
    }

}

xxl-job任务需用XxlJobLogger输出日志

单机模式:只启动一个任务执行器实例,修改路由模式即便是广播模式依然只有一个实例运行job

集群模式:启动多个任务实例,这里可以把每个实例的端口号都改为不同,可以看到同一个任务类有多个机器。除了广播模式,其他模式都只会选择机器列表中的一个执行job

单机多任务分片

对于多10条数据,我们可以创建多个任务每个任务完成不同的ID数据,只要ID不重合,那么就不会重复执行对应的事务

这里我们按id划分,[1,3,5,7,9],[2,4,6,8,10]为两组

    @XxlJob(value = "singleMachineMultiTasks", init = "init", destroy = "destroy")
    public ReturnT<String> singleMachineMultiTasks(String cities) throws Exception {

        if (StringUtils.isEmpty(cities)) {
            return new ReturnT(FAIL_CODE, "latnIds不能为空");
        }
         XxlJobLogger.log("任务参数={}", cities);
        //str转int数组,遍历ID列表
        Arrays.stream(cities.split(",")).map(String::trim).filter(StringUtils::isNotBlank).map(Integer::parseInt).forEach(latnId -> {
            //获取对应ID的未处理数据集合,遍历未处理数据集合并执行对应业务
            List<String> tasks = singleMachineMultiTasks.get(latnId);
            Optional.ofNullable(tasks).ifPresent(todoTasks -> {
                todoTasks.forEach(task -> {
                    XxlJobLogger.log("【{}】执行【{}】,任务内容为:{}", Thread.currentThread().getName(), latnId, task);
                });
            });
        });
        return ReturnT.SUCCESS;
    }


分别启动两个任务,并在管理器上配置好对应的参数
在这里插入图片描述
查看执行日志,两个控制台分别打印对应的执行日志如下:

任务参数=1,3,5,7,91】执行【{Thread-1}】,任务内容为:{武汉}3】执行【{Thread-1}】,任务内容为:{北京}5】执行【{Thread-1}】,任务内容为:{上海}



任务参数=2,4,6,8,102】执行【{Thread-20}】,任务内容为:{222}4】执行【{Thread-20}】,任务内容为:{444}6】执行【{Thread-20}】,任务内容为:{666}

集群分片

采用多机器取模的方式,来为不同的机器指定各自服务的ID列表

 @XxlJob(value = "multiMachineMultiTasks", init = "init", destroy = "destroy")
    public ReturnT<String> multiMachineMultiTasks(String params) throws Exception {
        ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();
        int n = shardingVO.getTotal(); // 动态获取所有实例数  
        int i = shardingVO.getIndex(); // 当前为第i个序号

        IntStream.range(0, CITY_ID_LIST.size()).forEach(cityIndex -> {
             //使用取余分片
            if (cityIndex % n == i) {
                int city = CITY_ID_LIST.get(cityIndex);
                List<String> tasks = singleMachineMultiTasks.get(city);
                Optional.ofNullable(tasks).ifPresent(todoTasks -> {
                    todoTasks.forEach(task -> {
                        XxlJobLogger.log("实例【{}】执行【{}】,任务内容为:{}", i, city, task);
                    });

                });
            }
        });
        return ReturnT.SUCCESS;
    }


 
    public void init() {
     log.info("init");
 }

 public void destroy() {
     log.info("destory");
 }

如果不显示的指明生命周期函数,在方法执行完之后,会被销毁。

新增一个任务,路由策略为分片广播
在这里插入图片描述
启动多个执行器实例
在这里插入图片描述
可以看到这个任务执执行器的机器地址有多个实例,说明它是集群模式运行。

查看控制台每个实例的日志都会根据取余分片执行不同的ID和任务内容
在这里插入图片描述
如果两个停一个,分片总数会发生变化,并且当前分片数也可能会发生变化

提出问题:取模方式对于顺序ID(自增ID)能很好的均匀分派分片数,那么对于范围分片(时间段分片)显然这里是没有提供类似分片算法的,根据实际项目情况,不一定非要用分片算法,不过不用分片算法,那么单例job又和没用有何区别呢?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XXL-JOB任务分片 的相关文章

随机推荐

  • Ubuntu下安装MySQL 以及C++连接MySQL

    一 简单分享Ubuntu 16 04下安装MySQL的过程 首先执行下面三条命令 sudo apt get install mysql server 此步骤可以省略 已经启用docker mysql服务容器 sudo apt get isn
  • ctf.show刷题记录_web(1-10)

    ctf平台 ctfshow https ctf show 1 签到 解题 base64解码 ctfshow 0da357d0 359b 47e1 80dc 5c02212725e5 2 web2 解题 正常页面 输入用户名admin 密码a
  • koin框架预研文档

    背景 koin框架简介 Koin框架 适用于使用Kotlin开发 是一款轻量级的依赖注入框架 无代理 无代码生成 无反射 相对于dagger 而言更加适合Kotlin语 引入目的 目前app比较常用的是dagger框架 dagger框架属于
  • echarts显示纵坐标轴上的箭头

    问题描述 提示 这里描述具体问题 在使用echarts时默认纵坐标是不显示的 所以你在怎么设置样式也不会显示出来 需要手动在代码里面写出来 yAxis name type value axisLine show true 这个是需要主动添加
  • java实现插入排序+代码推导

    图解 代码推导 package data structure import java util Arrays public class insertSort public static void main String args int a
  • 使用Eclipse IDE for GNU ARM搭建STM32的开发环境

    01 下载必要的文件 1 1 安装java运行环境 这一步比较简单 就不细说了 1 2 需要下载四个文件gnumcueclipse gcc arm none eabi xpack windows build tools jlink gnum
  • VS2017无法登录:我们无法刷新此账户的凭证、我们无法添加此账户发送请求时出错、评估期已结束,请登录以解除产品锁定

    之前下了vs但是开的有点慢习惯用codeblocks了 之后因为vs有快速生成类getset函数的快捷键就跑回来用 这个时候vs提示我 评估期已结束 请登录以解除产品锁定 问题描述 vs2017许可证到期 如何评估 解决方法 登录更新许可证
  • IRI-2016 Matlab 使用教程

    IRI2016在线计算模型 https ccmc gsfc nasa gov modelweb models iri2016 vitmo php 同时IRI2016还有Matlab和Fortran版本 其中的Matlab也是通过在线的接口进
  • 直流电机PID调节——P

    其实要用PID调节的话 最好是使用带有编码器的比较高端一点的直流减速电机 但是因为它价格有点贵 所以我们一般做智能小车就会选用普通的直流电机 但是普通的直流电机也是可以使用PID调节的 虽然它的效果没有带编码器得到直流减速电机的好 但是我们
  • 单片机检测脉冲个数c语言程序,C51单片机脉冲累加器(C语言程序)

    void timer0 void interrupt 1 using 1 switch count case 1 TH0 2700 pwm value 256 TL0 2700 pwm value 256 while 1 if pwm va
  • 分享个最佳的代码片段在线测试网站

    Its our pleasure to share best resources tools for web developers and designer Today we are 1 非常好的在线编译调试网站 https www onl
  • 10.网络爬虫—MongoDB详讲与实战

    网络爬虫 MongoDB详讲与实战 MongoDB MongoDB安装 创建数据目录 1 数据库操作 2 集合操作 3 文档操作 4 索引操作 5 聚合操作 6 备份与恢复 MongoDB增删改查 mongodb集合的增删改查 数据插入到表
  • 知识点记录-abase是什么

    Abase Abase是一套支持redis协议的分布式KV存储系统 是字节跳动自研的一套数据库系统 对在线业务发挥着核心作用 支持redis协议 高可用 低延迟 高扩展的kv存储 常用于redis的大容量持久化场景 为什么采用Abase r
  • 在react项目中调用百度地图API的BMap后报错解决方案

    我这里是使用了react typescript技术栈 在 public index html文件中引入百度地图项目的文件 就相当于是全局导入了 但是并不能直接使用相关的API 需要在使用的文件中这样声明一下 然后就可以直接使用了 const
  • stm32专题二十九:Flash 读写保护

    设置Flash的读写保护 其实就是操作内部Flash的选项字节 选项字节在内部Flash的主存储页之后 由于是Flash 不能像内存RAM一样随意写入 由于Flash的写入特性 只能将 1 写成 0 而如果要确保写入数据的绝对正确 则需要先
  • pytorch:nn.ReLU(inplace=True) 中的参数 inplane 的作用

    pytorch 的激活函数nn Relu 有一个参数 inplace 其作用是 该nn Relu 函数计算得到的输出是否更新传入的输出 正常情况下 一个卷积操作 首先经过卷积层 接着是正则化 Normalize 最后经过激活函数 而输入激活
  • Excel多行转置为一列

    原始数据如下 想把上述数据变成下边这个样子 面板模型数据录入需要用到下边这个形式的数据 步骤 1 先把所有原始数据转置 2 再在153 19下的单元格输入 C2 输入完之后 16 85就会在153 19下的单元格处了 再先横向 后纵向下拉即
  • 解决IDEA安装Python插件,下载失败的方法

    一 问题 通过file gt settings gt Plugins 安装python时 会提示下载失败 可以采用以下方法解决 二 解决办法 1 在help about中查看IDEA版本 作者的是181 4445 2 在https plug
  • Java架构直通车——结合源码理解PageHelper

    PageHelper实现方式 PageHelper首先将前端传递的参数保存到page这个对象中 接着将page的副本存放入ThreadLoacl中 这样可以保证分页的时候 参数互不影响 接着利用了mybatis提供的拦截器 取得Thread
  • XXL-JOB任务分片

    文章目录 任务类型 任务配置 路由策略 阻塞处理策略 单个任务和集群任务 单机多任务分片 集群分片 任务类型 单个任务 一个任务实例便可完成 单机单任务 单机模式下任何路由模式都只有一个实例执行 集群单任务 由路由策略 广播模式除外 选择其