XXL-JOB任务分片

这篇具有很好参考价值的文章主要介绍了XXL-JOB任务分片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

任务类型

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

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

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

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

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

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

任务配置

路由策略

策略 参数值 详细含义
第一个 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;
    }


分别启动两个任务,并在管理器上配置好对应的参数
XXL-JOB任务分片
查看执行日志,两个控制台分别打印对应的执行日志如下:

任务参数=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");
 }

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

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

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

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

到了这里,关于XXL-JOB任务分片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • xxl-job中在分片的时候项目模块如何开启多个执行器?

    在xxl-job中,要在分片时开启多个执行器,您需要按照以下步骤进行操作: 1.在xxl-job的项目中,找到对应的模块(即需要开启多个执行器的模块)。 2.在模块的配置文件(通常是application.properties或application.yml)中,找到以下属性: properties xxl.job.executor.appname=   xxl.job.executor

    2024年02月09日
    浏览(36)
  • xxl-Job分布式任务调度

    我们可以先思考一下业务场景的解决方案: 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。 某银行系统需要在信用卡到期还款日的前三天进行短信提醒。 某财务系统需要在每天凌晨0:10结算前一天的财务数据,统计汇总。 12306会根据车次的不同,设置某

    2024年02月15日
    浏览(44)
  • 【分布式任务调度平台 XXL-JOB 急速入门】从零开始将 XXL-JOB 接入到自己的项目

                                    💧 分布式任务调度平台 X X L − J O B 急速入门:从零开始将 X X L − J O B 接入到自己的项目 color{#FF1493}{分布式任务调度平台 XXL-JOB 急速入门:从零开始将 XXL-JOB 接入到自己的项目} 分布式任务调度平台 XX L − J OB 急速入门:从零

    2024年02月14日
    浏览(44)
  • xxl-Job分布式任务调度 入门

    我们可以先思考一下业务场景的解决方案: 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。 某银行系统需要在信用卡到期还款日的前三天进行短信提醒。 某财务系统需要在每天凌晨0:10结算前一天的财务数据,统计汇总。 12306会根据车次的不同,设置某

    2024年02月03日
    浏览(101)
  • 分布式定时任务调度xxl-job

    Quartz中最重要的三个对象:Job(作业)、Trigger(触发器)、Scheduler(调度器)。 xxl-job的调度原理:调度线程在一个while循环中不断地获取一定数量的即将触发的Trigger,拿到绑定的Job,包装成工作线程执行。 当然,不管在任何调度系统中,底层都是线程模型。如果要自己写一个

    2024年03月10日
    浏览(54)
  • 分布式定时任务-XXL-JOB-教程+实战

    1.定时任务认识 1.1.什么是定时任务 定时任务是按照指定时间周期运行任务。使用场景为在某个固定时间点执行,或者周期性的去执行某个任务,比如:每天晚上24点做数据汇总,定时发送短信等。 1.2.常见定时任务方案 While + Sleep : 通过循环加休眠的方式定时执行 Timer和Time

    2024年02月16日
    浏览(47)
  • SpringCloud-搭建XXL-JOB任务调度平台教程

    XXL-JOB是一个轻量级分布式任务调度框架,旨在解决分布式系统中的任务调度问题,提高系统的处理效率和任务管理的便捷性。 1. XXL-JOB任务调度概念 XXL-JOB任务调度平台通过中心化管理方式,使得任务的调度更加高效和集中。平台不仅提供了丰富的任务调度功能,例如:CRON表

    2024年04月28日
    浏览(40)
  • XXL-Job:提升任务调度效率的开源利器

    XXL-Job是由知名技术公司XXL-Tech团队开发和维护的,经过多年的发展和应用实践,已在众多企业和项目中获得广泛认可。它的特性和功能旨在简化任务调度的管理和执行,提高开发效率。 在本文中,我们将探讨XXL-Job的关键特点,包括其分布式任务调度能力、任务监控和管理功

    2024年02月13日
    浏览(69)
  • SpringBoot 集成 xxl-job 实现定时任务管理

    XXL-Job是一个功能强大的分布式任务调度框架,集成了Spring Boot后能够发挥更大的优势。它提供了分布式任务调度、任务执行报告、任务调度中心、良好的扩展性、分布式集群部署、监控与报警等多种优势。此外,XXL-Job是开源免费的,可以在GitHub上获取源代码和详细文档。详细

    2024年02月09日
    浏览(38)
  • XXL-JOB定时任务框架(Oracle定制版)

    xxl-job是一个轻量级、易扩展的分布式任务调度平台,能够快速开发和简单学习。开放源代码并被多家公司线上产品使用,开箱即用。尽管其确实非常好用,但我在工作中使用的是Oracle数据库,因为xxl-job是针对MySQL设计的,所以使用起来需要进行一些魔改。为了方便后人使用,

    2023年04月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包