From 56bcff8908a554433c64b37c77cf9efd3d958e74 Mon Sep 17 00:00:00 2001 From: byteblogs168 <598092184@qq.com> Date: Tue, 25 Jun 2024 00:01:33 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E8=AF=95map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 +- .../snailjob/job/TestMapJobExecutor.java | 146 ++++++++++++++++++ 2 files changed, 149 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/example/snailjob/job/TestMapJobExecutor.java diff --git a/pom.xml b/pom.xml index d4b5773..716b2d1 100644 --- a/pom.xml +++ b/pom.xml @@ -44,17 +44,17 @@ com.aizuda snail-job-client-starter - 1.0.0 + 1.1.0-beta2 com.aizuda snail-job-client-retry-core - 1.0.0 + 1.1.0-beta2 com.aizuda snail-job-client-job-core - 1.0.0 + 1.1.0-beta2 com.googlecode.aviator diff --git a/src/main/java/com/example/snailjob/job/TestMapJobExecutor.java b/src/main/java/com/example/snailjob/job/TestMapJobExecutor.java new file mode 100644 index 0000000..70528f3 --- /dev/null +++ b/src/main/java/com/example/snailjob/job/TestMapJobExecutor.java @@ -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> ranges = doSharding(1L, 1000000L, 100000); + return ranges; + } + } + + public static class MonthMap implements Map { + + @Override + public List map(MapArgs args) { + + // 第二层按照月分片 + // 4个季度 + List lists = JsonUtil.parseList(args.getMapResult(), Long.class); + List 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 map(MapArgs args); + } + + public static List> 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> 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; + } +}