diff --git a/austin-common/src/main/java/com/java3y/austin/enums/DeduplicationType.java b/austin-common/src/main/java/com/java3y/austin/enums/DeduplicationType.java new file mode 100644 index 0000000..3cf4b1c --- /dev/null +++ b/austin-common/src/main/java/com/java3y/austin/enums/DeduplicationType.java @@ -0,0 +1,37 @@ +package com.java3y.austin.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.ToString; + +import java.util.ArrayList; +import java.util.List; + +/** + * 去重类型枚举 + * @author 3y + */ +@Getter +@ToString +@AllArgsConstructor +public enum DeduplicationType { + + CONTENT(10, "N分钟相同内容去重"), + FREQUENCY(20, "一天内N次相同渠道去重"), + ; + private Integer code; + private String description; + + + /** + * 获取去重渠道的列表 + * @return + */ + public static List getDeduplicationList() { + ArrayList result = new ArrayList<>(); + for (DeduplicationType value : DeduplicationType.values()) { + result.add(value.getCode()); + } + return result; + } +} diff --git a/austin-handler/src/main/java/com/java3y/austin/domain/DeduplicationParam.java b/austin-handler/src/main/java/com/java3y/austin/domain/DeduplicationParam.java index e976a32..8f73ea5 100644 --- a/austin-handler/src/main/java/com/java3y/austin/domain/DeduplicationParam.java +++ b/austin-handler/src/main/java/com/java3y/austin/domain/DeduplicationParam.java @@ -1,8 +1,11 @@ package com.java3y.austin.domain; +import com.alibaba.fastjson.annotation.JSONField; import com.java3y.austin.enums.AnchorState; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; /** * @author 3y @@ -11,8 +14,9 @@ import lombok.Data; */ @Builder @Data +@AllArgsConstructor +@NoArgsConstructor public class DeduplicationParam { - /** * TaskIno信息 */ @@ -22,16 +26,17 @@ public class DeduplicationParam { * 去重时间 * 单位:秒 */ + @JSONField(name = "time") private Long deduplicationTime; /** * 需达到的次数去重 */ + @JSONField(name = "num") private Integer countNum; /** - * 标识属于哪种去重 + * 标识属于哪种去重(数据埋点) */ private AnchorState anchorState; - } diff --git a/austin-handler/src/main/java/com/java3y/austin/pending/Task.java b/austin-handler/src/main/java/com/java3y/austin/pending/Task.java index 87941af..b0afa41 100644 --- a/austin-handler/src/main/java/com/java3y/austin/pending/Task.java +++ b/austin-handler/src/main/java/com/java3y/austin/pending/Task.java @@ -44,7 +44,7 @@ public class Task implements Runnable { return; } - // 1.平台通用去重 + // 1.平台通用去重 test deduplicationRuleService.duplication(taskInfo); // 2. 真正发送消息 diff --git a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/DeduplicationHolder.java b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/DeduplicationHolder.java new file mode 100644 index 0000000..342c5a8 --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/DeduplicationHolder.java @@ -0,0 +1,36 @@ +package com.java3y.austin.service.deduplication; + +import com.java3y.austin.service.deduplication.build.Builder; +import com.java3y.austin.service.deduplication.service.DeduplicationService; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + + +/** + * @author huskey + * @date 2022/1/18 + */ +@Service +public class DeduplicationHolder { + + private Map builderHolder = new HashMap<>(4); + private Map serviceHolder = new HashMap<>(4); + + public Builder selectBuilder(Integer key) { + return builderHolder.get(key); + } + + public DeduplicationService selectService(Integer key) { + return serviceHolder.get(key); + } + + public void putBuilder(Integer key, Builder builder) { + builderHolder.put(key, builder); + } + + public void putService(Integer key, DeduplicationService service) { + serviceHolder.put(key, service); + } +} diff --git a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/DeduplicationRuleService.java b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/DeduplicationRuleService.java index 52ca75b..abfc5d0 100644 --- a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/DeduplicationRuleService.java +++ b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/DeduplicationRuleService.java @@ -1,18 +1,15 @@ package com.java3y.austin.service.deduplication; -import cn.hutool.core.date.DateUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.ctrip.framework.apollo.Config; import com.ctrip.framework.apollo.spring.annotation.ApolloConfig; import com.java3y.austin.constant.AustinConstant; import com.java3y.austin.domain.DeduplicationParam; import com.java3y.austin.domain.TaskInfo; -import com.java3y.austin.enums.AnchorState; +import com.java3y.austin.enums.DeduplicationType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.Date; +import java.util.List; /** * @author 3y. @@ -22,47 +19,27 @@ import java.util.Date; @Service public class DeduplicationRuleService { - /** - * 配置样例:{"contentDeduplication":{"num":1,"time":300},"frequencyDeduplication":{"num":5}} - */ - private static final String DEDUPLICATION_RULE_KEY = "deduplication"; - private static final String CONTENT_DEDUPLICATION = "contentDeduplication"; - private static final String FREQUENCY_DEDUPLICATION = "frequencyDeduplication"; - private static final String TIME = "time"; - private static final String NUM = "num"; - - @Autowired - private ContentDeduplicationService contentDeduplicationService; - - @Autowired - private FrequencyDeduplicationService frequencyDeduplicationService; + public static final String DEDUPLICATION_RULE_KEY = "deduplication"; @ApolloConfig("boss.austin") private Config config; - public void duplication(TaskInfo taskInfo) { - // 配置示例:{"contentDeduplication":{"num":1,"time":300},"frequencyDeduplication":{"num":5}} - JSONObject property = JSON.parseObject(config.getProperty(DEDUPLICATION_RULE_KEY, AustinConstant.APOLLO_DEFAULT_VALUE_JSON_OBJECT)); - JSONObject contentDeduplication = property.getJSONObject(CONTENT_DEDUPLICATION); - JSONObject frequencyDeduplication = property.getJSONObject(FREQUENCY_DEDUPLICATION); - - // 文案去重 - DeduplicationParam contentParams = DeduplicationParam.builder() - .deduplicationTime(contentDeduplication.getLong(TIME)) - .countNum(contentDeduplication.getInteger(NUM)).taskInfo(taskInfo) - .anchorState(AnchorState.CONTENT_DEDUPLICATION) - .build(); - contentDeduplicationService.deduplication(contentParams); - + @Autowired + private DeduplicationHolder deduplicationHolder; - // 运营总规则去重(一天内用户收到最多同一个渠道的消息次数) - Long seconds = (DateUtil.endOfDay(new Date()).getTime() - DateUtil.current()) / 1000; - DeduplicationParam businessParams = DeduplicationParam.builder() - .deduplicationTime(seconds) - .countNum(frequencyDeduplication.getInteger(NUM)).taskInfo(taskInfo) - .anchorState(AnchorState.RULE_DEDUPLICATION) - .build(); - frequencyDeduplicationService.deduplication(businessParams); + public void duplication(TaskInfo taskInfo) { + // 配置样例:{"deduplication_10":{"num":1,"time":300},"deduplication_20":{"num":5}} + String deduplicationConfig = config.getProperty(DEDUPLICATION_RULE_KEY, AustinConstant.APOLLO_DEFAULT_VALUE_JSON_OBJECT); + + // 去重 + List deduplicationList = DeduplicationType.getDeduplicationList(); + for (Integer deduplicationType : deduplicationList) { + DeduplicationParam deduplicationParam = deduplicationHolder.selectBuilder(deduplicationType).build(deduplicationConfig, taskInfo); + if (deduplicationParam != null) { + deduplicationHolder.selectService(deduplicationType).deduplication(deduplicationParam); + } + } } + } diff --git a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/AbstractDeduplicationBuilder.java b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/AbstractDeduplicationBuilder.java new file mode 100644 index 0000000..62ade65 --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/AbstractDeduplicationBuilder.java @@ -0,0 +1,40 @@ +package com.java3y.austin.service.deduplication.build; + +import com.alibaba.fastjson.JSONObject; +import com.java3y.austin.domain.DeduplicationParam; +import com.java3y.austin.domain.TaskInfo; +import com.java3y.austin.service.deduplication.DeduplicationHolder; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.PostConstruct; + +/** + * @author 3y + * @date 2022/1/19 + */ +public abstract class AbstractDeduplicationBuilder implements Builder { + + protected Integer deduplicationType; + + @Autowired + private DeduplicationHolder deduplicationHolder; + + @PostConstruct + public void init() { + deduplicationHolder.putBuilder(deduplicationType, this); + } + + public DeduplicationParam getParamsFromConfig(Integer key, String duplicationConfig, TaskInfo taskInfo) { + JSONObject object = JSONObject.parseObject(duplicationConfig); + if (object == null) { + return null; + } + DeduplicationParam deduplicationParam = JSONObject.parseObject(object.getString(CONFIG_PRE + key), DeduplicationParam.class); + if (deduplicationParam == null) { + return null; + } + deduplicationParam.setTaskInfo(taskInfo); + return deduplicationParam; + } + +} diff --git a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/Builder.java b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/Builder.java new file mode 100644 index 0000000..b2fe075 --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/Builder.java @@ -0,0 +1,22 @@ +package com.java3y.austin.service.deduplication.build; + +import com.java3y.austin.domain.DeduplicationParam; +import com.java3y.austin.domain.TaskInfo; + +/** + * @author luohaojie + * @date 2022/1/18 + */ +public interface Builder { + + String CONFIG_PRE = "deduplication_"; + + /** + * 根据配置构建去重参数 + * + * @param deduplication + * @param taskInfo + * @return + */ + DeduplicationParam build(String deduplication, TaskInfo taskInfo); +} diff --git a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/ContentDeduplicationBuilder.java b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/ContentDeduplicationBuilder.java new file mode 100644 index 0000000..238819e --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/ContentDeduplicationBuilder.java @@ -0,0 +1,31 @@ +package com.java3y.austin.service.deduplication.build; + +import com.java3y.austin.domain.DeduplicationParam; +import com.java3y.austin.domain.TaskInfo; +import com.java3y.austin.enums.AnchorState; +import com.java3y.austin.enums.DeduplicationType; +import org.springframework.stereotype.Service; + + +/** + * @author huskey + * @date 2022/1/18 + */ +@Service +public class ContentDeduplicationBuilder extends AbstractDeduplicationBuilder implements Builder { + + public ContentDeduplicationBuilder() { + deduplicationType = DeduplicationType.CONTENT.getCode(); + } + + @Override + public DeduplicationParam build(String deduplication, TaskInfo taskInfo) { + DeduplicationParam deduplicationParam = getParamsFromConfig(deduplicationType, deduplication, taskInfo); + if (deduplication == null) { + return null; + } + deduplicationParam.setAnchorState(AnchorState.CONTENT_DEDUPLICATION); + return deduplicationParam; + + } +} diff --git a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/FrequencyDeduplicationBuilder.java b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/FrequencyDeduplicationBuilder.java new file mode 100644 index 0000000..b1d0ab4 --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/FrequencyDeduplicationBuilder.java @@ -0,0 +1,33 @@ +package com.java3y.austin.service.deduplication.build; + +import cn.hutool.core.date.DateUtil; +import com.java3y.austin.domain.DeduplicationParam; +import com.java3y.austin.domain.TaskInfo; +import com.java3y.austin.enums.AnchorState; +import com.java3y.austin.enums.DeduplicationType; +import org.springframework.stereotype.Service; + +import java.util.Date; + +/** + * @author huskey + * @date 2022/1/18 + */ + +@Service +public class FrequencyDeduplicationBuilder extends AbstractDeduplicationBuilder implements Builder { + public FrequencyDeduplicationBuilder() { + deduplicationType = DeduplicationType.FREQUENCY.getCode(); + } + + @Override + public DeduplicationParam build(String deduplication, TaskInfo taskInfo) { + DeduplicationParam deduplicationParam = getParamsFromConfig(deduplicationType, deduplication, taskInfo); + if (deduplicationParam == null) { + return null; + } + deduplicationParam.setDeduplicationTime((DateUtil.endOfDay(new Date()).getTime() - DateUtil.current()) / 1000); + deduplicationParam.setAnchorState(AnchorState.RULE_DEDUPLICATION); + return deduplicationParam; + } +} diff --git a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/AbstractDeduplicationService.java b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/service/AbstractDeduplicationService.java similarity index 87% rename from austin-handler/src/main/java/com/java3y/austin/service/deduplication/AbstractDeduplicationService.java rename to austin-handler/src/main/java/com/java3y/austin/service/deduplication/service/AbstractDeduplicationService.java index 912199a..b51b9db 100644 --- a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/AbstractDeduplicationService.java +++ b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/service/AbstractDeduplicationService.java @@ -1,16 +1,17 @@ -package com.java3y.austin.service.deduplication; +package com.java3y.austin.service.deduplication.service; import cn.hutool.core.collection.CollUtil; import com.java3y.austin.constant.AustinConstant; import com.java3y.austin.domain.AnchorInfo; import com.java3y.austin.domain.DeduplicationParam; import com.java3y.austin.domain.TaskInfo; -import com.java3y.austin.enums.AnchorState; +import com.java3y.austin.service.deduplication.DeduplicationHolder; import com.java3y.austin.utils.LogUtils; import com.java3y.austin.utils.RedisUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import javax.annotation.PostConstruct; import java.util.*; /** @@ -19,11 +20,21 @@ import java.util.*; * 去重服务 */ @Slf4j -public abstract class AbstractDeduplicationService { +public abstract class AbstractDeduplicationService implements DeduplicationService { + protected Integer deduplicationType; + + @Autowired + private DeduplicationHolder deduplicationHolder; + + @PostConstruct + private void init() { + deduplicationHolder.putService(deduplicationType, this); + } @Autowired private RedisUtils redisUtils; + @Override public void deduplication(DeduplicationParam param) { TaskInfo taskInfo = param.getTaskInfo(); Set filterReceiver = new HashSet<>(taskInfo.getReceiver().size()); diff --git a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/ContentDeduplicationService.java b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/service/ContentDeduplicationService.java similarity index 79% rename from austin-handler/src/main/java/com/java3y/austin/service/deduplication/ContentDeduplicationService.java rename to austin-handler/src/main/java/com/java3y/austin/service/deduplication/service/ContentDeduplicationService.java index 1b41e44..a305359 100644 --- a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/ContentDeduplicationService.java +++ b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/service/ContentDeduplicationService.java @@ -1,8 +1,9 @@ -package com.java3y.austin.service.deduplication; +package com.java3y.austin.service.deduplication.service; import cn.hutool.crypto.digest.DigestUtil; import com.alibaba.fastjson.JSON; import com.java3y.austin.domain.TaskInfo; +import com.java3y.austin.enums.DeduplicationType; import org.springframework.stereotype.Service; /** @@ -13,6 +14,10 @@ import org.springframework.stereotype.Service; @Service public class ContentDeduplicationService extends AbstractDeduplicationService { + public ContentDeduplicationService() { + deduplicationType = DeduplicationType.CONTENT.getCode(); + } + /** * 内容去重 构建key *

diff --git a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/service/DeduplicationService.java b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/service/DeduplicationService.java new file mode 100644 index 0000000..e0abf27 --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/service/DeduplicationService.java @@ -0,0 +1,16 @@ +package com.java3y.austin.service.deduplication.service; + +import com.java3y.austin.domain.DeduplicationParam; + +/** + * @author huskey + * @date 2022/1/18 + */ +public interface DeduplicationService { + + /** + * 去重 + * @param param + */ + void deduplication(DeduplicationParam param); +} diff --git a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/FrequencyDeduplicationService.java b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/service/FrequencyDeduplicationService.java similarity index 80% rename from austin-handler/src/main/java/com/java3y/austin/service/deduplication/FrequencyDeduplicationService.java rename to austin-handler/src/main/java/com/java3y/austin/service/deduplication/service/FrequencyDeduplicationService.java index c135f46..bc23513 100644 --- a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/FrequencyDeduplicationService.java +++ b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/service/FrequencyDeduplicationService.java @@ -1,7 +1,8 @@ -package com.java3y.austin.service.deduplication; +package com.java3y.austin.service.deduplication.service; import cn.hutool.core.util.StrUtil; import com.java3y.austin.domain.TaskInfo; +import com.java3y.austin.enums.DeduplicationType; import org.springframework.stereotype.Service; /** @@ -12,6 +13,10 @@ import org.springframework.stereotype.Service; @Service public class FrequencyDeduplicationService extends AbstractDeduplicationService { + public FrequencyDeduplicationService() { + deduplicationType = DeduplicationType.FREQUENCY.getCode(); + } + private static final String PREFIX = "FRE"; /**