【Java】【XXL-job】4.分片
前面,我们已经学会了xxl-job的基础使用:
有的时候,一个任务需要执行比较长的时间,这时候就涉及到了切片广播。
基础使用
这里我们先建立一个简单的切片任务,获取分片序号和分片总数。
@Component
public class PickDemoXxlJob {
@XxlJob("pickDemoXxlJob")
public void pickDemoXxlJob() throws Exception {
int shardIndex = XxlJobHelper.getShardIndex(); // 分片序号
int shardTotal = XxlJobHelper.getShardTotal(); // 分片总数
System.out.println("当前分片[" + shardIndex +"],分片总数[" + shardTotal +"]");
}
}
启动xxl-job任务调度中心,并配置任务。设置路由策略为“分片广播”。分别启动任务(这里分别为2006,2007,2008)。

执行一次后,可以发现,3个项目都获取到了分片序号和分片总数。



分片的使用
那么,获取到分片有什么作用呢?假设,我们需要处理一个数据。
@XxlJob("pickDemoXxlJobSendMessage")
public void pickDemoXxlJobSendMessage() throws InterruptedException {
Date startDate = new Date();
// 1. 获取分片
int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal();
int counts = 1000;
// 2. 根据分片获取要处理的数据,并处理
for (int i = 0; i < counts; i++){
if (i % shardTotal == shardIndex){
System.out.println("[" + LocalDateTime.now() +"][" + (shardIndex + 1) +"/" + shardTotal +"][" + (i + 1) +"/" + counts +"]");
Thread.sleep(100); // 暂停0.1s
}
}
int sconds = (int) ((new Date().getTime() - startDate.getTime()) / 1000);
System.out.println("[" + (shardIndex + 1) +"/" + shardTotal +"][耗时]"+ sconds + "s,共" + counts + "条数据");
}
如果只启动1台。当前任务耗时110s。可以发现,每条任务都在当前项目执行。

如果启动3台。单个服务器耗时降低为36s,每条任务分布到各个子服务器中。

有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

浙公网安备 33010602011771号