xxl-job(四)路由策略
接上一篇:一、任务路由策略:总共有1、第一个:始终执行执行器的第一个机器,如我配置了两个节点,则只执行第一个即141节点的服务
·
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机器打印:
更多推荐
已为社区贡献11条内容
所有评论(0)