【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)。
image

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

分片的使用

那么,获取到分片有什么作用呢?假设,我们需要处理一个数据。

@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。可以发现,每条任务都在当前项目执行。
image

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

posted @ 2025-03-28 15:33  陆陆无为而治者  阅读(151)  评论(0)    收藏  举报