调试map

This commit is contained in:
byteblogs168 2024-06-25 00:01:33 +08:00
parent f8bd156675
commit 56bcff8908
2 changed files with 149 additions and 3 deletions

View File

@ -44,17 +44,17 @@
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-starter</artifactId>
<version>1.0.0</version>
<version>1.1.0-beta2</version>
</dependency>
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-retry-core</artifactId>
<version>1.0.0</version>
<version>1.1.0-beta2</version>
</dependency>
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-job-core</artifactId>
<version>1.0.0</version>
<version>1.1.0-beta2</version>
</dependency>
<dependency>
<groupId>com.googlecode.aviator</groupId>

View File

@ -0,0 +1,146 @@
package com.example.snailjob.job;
import com.aizuda.snailjob.client.job.core.dto.MapArgs;
import com.aizuda.snailjob.client.job.core.executor.AbstractMapExecutor;
import com.aizuda.snailjob.client.model.ExecuteResult;
import com.aizuda.snailjob.common.core.util.JsonUtil;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Random;
/**
* 以下是一个统计某电商公司商家的一年的营业额的计算过程
*
* @author: opensnail
* @date : 2024-06-13
* @since : sj_1.1.0
*/
@Component
public class TestMapJobExecutor extends AbstractMapExecutor {
@Override
public ExecuteResult doJobMapExecute(MapArgs mapArgs) {
MapEnum mapEnum = MapEnum.ofMap(mapArgs.getTaskName());
if (Objects.nonNull(mapEnum)) {
Map map = mapEnum.getMap();
return doMap(map.map(mapArgs), mapEnum.name());
}
// 未找到map的任务则说明当前需要进行处理
String mapResult = mapArgs.getMapResult();
// 获取最后一次map的信息.
MonthMap.SubTask subTask = JsonUtil.parseObject(mapResult, MonthMap.SubTask.class);
// 此处可以统计数据或者做其他的事情
// 模拟统计营业额
int turnover = new Random().nextInt(1000000);
return ExecuteResult.success(turnover);
}
@Getter
private enum MapEnum {
MAP_ROOT(new RootMap()),
MONTH_MAP(new MonthMap())
;
private final Map map;
MapEnum(Map map) {
this.map = map;
}
public static MapEnum ofMap(String taskName) {
for (final MapEnum value : MapEnum.values()) {
if (value.name().equals(taskName)) {
return value;
}
}
return null;
}
}
private static class RootMap implements Map {
@Override
public List map(MapArgs args) {
// 第一层按照商家ID分片
// 假设总共有一百万商家 每个分片处理10万商家
List<List<Long>> ranges = doSharding(1L, 1000000L, 100000);
return ranges;
}
}
public static class MonthMap implements Map {
@Override
public List map(MapArgs args) {
// 第二层按照月分片
// 4个季度
List<Long> lists = JsonUtil.parseList(args.getMapResult(), Long.class);
List<SubTask> list = new ArrayList<>();
for (final Long id : lists) {
for (int i = 1; i <= 4; i++) {
list.add(new SubTask(id, i));
}
}
return list;
}
@Data
@AllArgsConstructor
public static class SubTask {
// 商家id
private Long id;
// 需要处理的月份
private Integer quarter;
}
}
interface Map{
List<Object> map(MapArgs args);
}
public static List<List<Long>> doSharding(Long min, Long max, int interval) {
if (max.equals(min)) {
return new ArrayList<>();
}
// 总数量
long total = max - min + 1;
// 计算分页总页数
Long totalPages = total / interval;
if (total % interval != 0) {
totalPages++;
}
List<List<Long>> partitions = new ArrayList<>();
for (Long index = 0L; index < totalPages; index++) {
// 计算起始点 因为是从min开始所以每次需要加上一个min
Long start = index * interval + min;
// 结算结束点 若最后一个 start + interval - 1 > max 取max
// 减一是保证 [start, end] 都是闭区间
Long end = Math.min(start + interval - 1, max);
partitions.add(Lists.newArrayList(start, end));
}
return partitions;
}
}