xxl-job如何实现分片处理

xxl-job是一个开源的Java实现的分布式任务调度平台,支持Cron、API等多种调度方式和丰富的任务路由策略。文章介绍了其任务执行日志、报警机制及分片广播等功能,适合大规模任务调度。在集群环境中,xxl-job利用任务路由策略确保任务在节点间的有效分配,例如使用分片广播来加速执行长耗时任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简介

  xxl-job是一款开源、分布式任务调度平台。它基于Java语言开发,提供Web界面和API接口,支持多种任务调度方式,如Cron、API、固定速率等,并具备任务依赖、任务分片、任务路由等高级功能。xxl-job还提供任务执行日志、报警通知、任务失败重试等实用工具,方便用户管理和监控任务。xxl-job的设计理念是简单易用、高可靠、高性能,适用于各种规模的任务调度需求。

二、场景描述

  一般在集群环境下,我们job被部署了多个节点,xxl-job需要做到只要有一个节点去执行job,这时候需要依赖xxl-job的任务路由策略进行分配节点。
  xxl-job提供的路由策略有:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移、分片广播。
  对于简单的任务,我们选择轮询、随机、故障转移都是可以的,但是对于执行时间长的任务,我们希望能分散到各个节点上执行,从而加快完成的速度,这时候就需要用到分片广播。

三、代码以及配置

xxl-job的页面配置如下,路由策略选择分片广播
图片.pngJobHandler的代码如下

/**
 * 分片广播任务
 */
@XxlJob("shardingJobHandler")
public void shardingJobHandler() throws Exception {

    // 分片参数
    int shardIndex = XxlJobHelper.getShardIndex();
    int shardTotal = XxlJobHelper.getShardTotal();

	XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);
	//获取需要处理的所有门店列表
	List<StoreInfo> storeInfoList = storeInfoMapper.selectList(new QueryWrapper<StoreInfo>().lambda().orderByDesc(StoreInfo::getStoreCode));

	//当前分片需要处理的门店列表
	List<StoreInfo> shardStoreInfoList = new ArrayList<>();
    // 业务逻辑
    for (int i = 0; i < storeInfoList.size(); i++) {
        if (i % shardTotal == shardIndex) {
            //将当前分片需要处理的门店加入list
            shardStoreInfoList.add(storeInfoList.get(i));
        }
    }
    //处理业务逻辑...
	service.doBusiness(shardStoreInfoList);
}
### XXL-JOB 自定义分片策略实现 #### 定义自定义分片处理器 为了在XXL-JOB实现自定义分片逻辑,可以通过继承`AbstractShardingContext`类并重写其方法来完成特定业务需求下的数据分片处理。下面是一个简单的例子展示如何创建一个新的Java类作为自定义分片处理器。 ```java import com.xxl.job.core.context.ShardingContext; import com.xxl.job.core.executor.impl.XxlJobExecutor; public class CustomShardingHandler extends AbstractShardingContext { @Override public void handle(ShardingContext shardingContext) { int totalShards = getTotalShardCount(); // 获取总的分片数量 String param = getParam(); // 获取参数 System.out.println(String.format("Total shards: %d, Params: %s", totalShards, param)); // 用户可以根据实际应用场景调整此处的分片算法 for (int i = 0; i < totalShards; ++i){ if (shardingContext.getShardingItem() == i){ processTask(i); // 执行具体的任务处理函数 } } } private void processTask(int shardIndex){ // 处理单个分片的任务... System.out.printf("Processing task on shard index=%d\n", shardIndex); } } ``` 此代码片段展示了如何构建一个名为`CustomShardingHandler`的新类,该类实现了对输入参数和总分片数目的读取,并基于当前线程所分配到的具体分片索引来决定要执行哪些操作[^1]。 #### 配置文件设置 为了让上述自定义分片处理器生效,在项目的配置文件(通常是application.yml或application.properties)里指定相应的属性: 对于YAML格式的应用程序配置文件(application.yml),如下所示: ```yaml xxl: job: admin: addresses: http://localhost:8080/xxl-job-admin executor: appname: xxl-job-executor-sample ip: port: 9999 logpath: /data/applogs/xxl-job/jobhandler logretentiondays: 30 custom-sharding-handler-class-name: "com.example.CustomShardingHandler" ``` 这里特别注意最后一条配置项`custom-sharding-handler-class-name`指定了之前编写的自定义分片处理器全限定名[^2]。 #### 注册Bean至Spring容器 如果是在Spring Boot环境中,则还需要确保将这个新的分片处理器注册成一个Spring Bean以便能够被自动扫描加载进来。可以在任意@Configuration标注过的类里面加入@Bean的方法返回实例化的对象即可。 ```java package com.example.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JobConfig { @Bean public CustomShardingHandler customShardingHandler(){ return new CustomShardingHandler(); } } ``` 这样就完成了整个流程——从编写自定义分片处理器到最后将其注入Spring上下文中去[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步亿点点的小码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值