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