xxl-job的任务路由策略:总共有下面这几种

路由策略:当执行器集群部署时,提供丰富的路由策略,包括;
        FIRST(第一个):固定选择第一个机器;
        LAST(最后一个):固定选择最后一个机器;
        ROUND(轮询):;
        RANDOM(随机):随机选择在线的机器;
        CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
        LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举;
        LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;
        FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
        BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
        SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片			参数开发分片任务;
任务超时时间:支持自定义任务超时时间,任务运行超时将会主动中断任务;
失败重试次数;支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;

接上一篇,这里,我配置了两个节点

并把jobOne设置为每30秒执行一次。

一、第一个/最后一个策略:

1、第一个策略:

(1)两个节点均启动:发现只有第一个节点在执行:

(2)停止第一个节点:第二个节点也不会执行:

(3)手动执行一次:仍然由第一个节点执行:

2、最后一个策略:

二、轮询策略:

1、两个节点均启动:轮询执行

2、停止localhost节点服务:发现还是在轮询,每次轮到localhost这个节点执行失败不插入数据,周期不正常:

3、手动执行:也是轮询的,只会被执行一次

三、随机策略:

1、两个节点均启动:对于两个节点的随机有点类似轮询

2、停止localhost节点:也不会自动剔除故障节点

四、故障转移策略:

1、两个节点均启动:

目前一直是141节点在执行,

2、停止141节点服务:localhost节点开始执行了,周期正常

3、手动执行:手动执行也只会被执行一次:

五、一致性HASH

并配置阻塞处理策略为丢弃后续调度,多节点集群适用。

六、分片广播策略:

1、获取分片参数

不同xxl-job版本获取分片参数有些差别,2.3.0

int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();

2.1.2版本

// 获取分片总数和当前分片索引
        ShardingUtil.ShardingVO shardingVo = ShardingUtil.getShardingVo();
        int numbers = shardingVo.getTotal();  // 分片总数
        int index = shardingVo.getIndex(); // 当前分片索引
2、demo
/**
 * 分片广播任务
 */
@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);
}

 如我服务部署了两个节点,并将节点配置到执行器中:

执行一次任务,查看日志:可以看到两个节点都执行了,分片总数为2,序号分别为0、1,

126机器打印:

123机器打印:

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐