一、XXL-Job 解决的问题
- 解决集群任务的重复执行问题
- cron表达式定义灵活
- 定时任务失败了,重试和统计
- 任务量大,分片执行
二、XXL-Job的路由策略有哪些?
假设现在XXL-Job服务集群中有两台实例,需要执行的任务有6条。那么这些任务分别在哪台实例上执行呢?通过路由策略就可以解决这个问题。
- FIRST:固定选择第一个机器。
- LAST:固定选择最后一个机器。
ROUND:轮询。- RANDOM:随机选择在线的机器。
- CONSISTENT_HASH(一致性HASH):每个任务按照hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
- LEAST_FREQUENTLY_USED(最不经常使用): 使用频率最低的机器优先被选举。
- LEAST_RECENTLY_USED(最近最久未使用):最久未使用的的机器优先被选举。
FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度。- BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度。
SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自发传递分片参数。可根据分片参数开发分片任务。适合任务量比较大的任务。
二、XXL-Job任务执行失败,怎么解决?
- 路由策略
故障转移+失败重试
- 查看日志分析
3. 设置邮件告警
需要在代码中设置邮箱的IP、PORT、协议等信息,并且在XXL-JOB控制台中设置邮箱。
三、如何同时执行大数据量任务?
执行器集群部署时,任务路由策略选择分片广播情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务。
分片参数:
- index:当前分片序号(从0开始),执行器集群列表中当前执行器的序号。
- total: 总分片数,执行器集群的总机器数量。
任务项找到分片:index = 任务项ID % total
@XxlJob("shardingSample")
public void shardingJobHandler() {
//分片参数
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
//业务逻辑
List<Integer> list = getList();
for (Integer integer : list) {
if (integer % shardTotal == shardIndex) {
System.out.println("第" + shardIndex + "分片执行,执行数据为:" + integer);
}
}
}