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..1c65366 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,5 +1,6 @@ package com.java3y.austin.domain; +import com.alibaba.fastjson.annotation.JSONField; import com.java3y.austin.enums.AnchorState; import lombok.Builder; import lombok.Data; @@ -12,7 +13,6 @@ import lombok.Data; @Builder @Data public class DeduplicationParam { - /** * TaskIno信息 */ @@ -22,16 +22,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/service/deduplication/AbstractDeduplicationService.java b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/AbstractDeduplicationService.java index 912199a..d1fb8c6 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/AbstractDeduplicationService.java @@ -19,7 +19,7 @@ import java.util.*; * 去重服务 */ @Slf4j -public abstract class AbstractDeduplicationService { +public abstract class AbstractDeduplicationService implements DeduplicationService { @Autowired private RedisUtils redisUtils; diff --git a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/DeduplicationConstants.java b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/DeduplicationConstants.java new file mode 100644 index 0000000..b2cef57 --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/DeduplicationConstants.java @@ -0,0 +1,15 @@ +package com.java3y.austin.service.deduplication; + +/** + * @author huskey + * @date 2022/1/18 + */ +public class DeduplicationConstants { + + /** + * 配置样例:{"contentDeduplication":{"num":1,"time":300},"frequencyDeduplication":{"num":5}} + */ + public static final String DEDUPLICATION_RULE_KEY = "deduplication"; + public static final String CONTENT_DEDUPLICATION = "contentDeduplication"; + public static final String FREQUENCY_DEDUPLICATION = "frequencyDeduplication"; +} 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..2db2503 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,17 @@ 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.google.common.collect.Lists; 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.service.deduplication.build.BuilderFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; -import java.util.Date; +import java.util.List; /** * @author 3y. @@ -22,47 +21,39 @@ 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; + private static final String SERVICE = "Service"; + @ApolloConfig("boss.austin") + private Config config; @Autowired - private FrequencyDeduplicationService frequencyDeduplicationService; + private ApplicationContext applicationContext; + @Autowired + private BuilderFactory builderFactory; - @ApolloConfig("boss.austin") - private Config config; + //需要去重的服务 + private static final List DEDUPLICATION_LIST = Lists.newArrayList(DeduplicationConstants.CONTENT_DEDUPLICATION, DeduplicationConstants.FREQUENCY_DEDUPLICATION); 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); + // 配置样例:{"contentDeduplication":{"num":1,"time":300},"frequencyDeduplication":{"num":5}} + String deduplication = config.getProperty(DeduplicationConstants.DEDUPLICATION_RULE_KEY, AustinConstant.APOLLO_DEFAULT_VALUE_JSON_OBJECT); + //去重 + DEDUPLICATION_LIST.forEach( + key -> { + DeduplicationParam deduplicationParam = builderFactory.select(key).build(deduplication, key); + if (deduplicationParam != null) { + deduplicationParam.setTaskInfo(taskInfo); + DeduplicationService deduplicationService = findService(key + SERVICE); + deduplicationService.deduplication(deduplicationParam); + } + } + ); - // 文案去重 - DeduplicationParam contentParams = DeduplicationParam.builder() - .deduplicationTime(contentDeduplication.getLong(TIME)) - .countNum(contentDeduplication.getInteger(NUM)).taskInfo(taskInfo) - .anchorState(AnchorState.CONTENT_DEDUPLICATION) - .build(); - contentDeduplicationService.deduplication(contentParams); + } + private DeduplicationService findService(String beanName) { + return applicationContext.getBean(beanName, DeduplicationService.class); - // 运营总规则去重(一天内用户收到最多同一个渠道的消息次数) - 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); } } diff --git a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/DeduplicationService.java b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/DeduplicationService.java new file mode 100644 index 0000000..35c4b80 --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/DeduplicationService.java @@ -0,0 +1,12 @@ +package com.java3y.austin.service.deduplication; + +import com.java3y.austin.domain.DeduplicationParam; + +/** + * @author huskey + * @date 2022/1/18 + */ +public interface DeduplicationService { + + void deduplication(DeduplicationParam param); +} 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..cd78e38 --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/Builder.java @@ -0,0 +1,12 @@ +package com.java3y.austin.service.deduplication.build; + +import com.java3y.austin.domain.DeduplicationParam; + +/** + * @author luohaojie + * @date 2022/1/18 + */ +public interface Builder { + + DeduplicationParam build(String deduplication, String key); +} diff --git a/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/BuilderFactory.java b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/BuilderFactory.java new file mode 100644 index 0000000..795dafa --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/BuilderFactory.java @@ -0,0 +1,40 @@ +package com.java3y.austin.service.deduplication.build; + +import com.java3y.austin.service.deduplication.DeduplicationConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.util.HashMap; +import java.util.Map; + + +/** + * @author huskey + * @date 2022/1/18 + */ + +@Service +public class BuilderFactory { + + + private Map builderFactory = new HashMap<>(4); + + @Autowired + private Builder contentDeduplicationBuilder; + + @Autowired + private Builder frequencyDeduplicationBuilder; + + @PostConstruct + public void init() { + builderFactory.put(DeduplicationConstants.CONTENT_DEDUPLICATION, contentDeduplicationBuilder); + builderFactory.put(DeduplicationConstants.FREQUENCY_DEDUPLICATION, frequencyDeduplicationBuilder); + } + + + public Builder select(String key) { + return builderFactory.get(key); + } + +} 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..a542712 --- /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.alibaba.fastjson.JSONObject; +import com.java3y.austin.domain.DeduplicationParam; +import com.java3y.austin.enums.AnchorState; +import com.java3y.austin.service.deduplication.build.Builder; +import org.springframework.stereotype.Service; + + +/** + * @author huskey + * @date 2022/1/18 + */ + +@Service +public class ContentDeduplicationBuilder implements Builder { + + public DeduplicationParam build(String deduplication, String key) { + JSONObject object = JSONObject.parseObject(deduplication); + if (object == null) { + return null; + } + DeduplicationParam deduplicationParam = JSONObject.parseObject(object.getString(key), DeduplicationParam.class); + if (deduplicationParam == null) { + return null; + } + deduplicationParam.setAnchorState(AnchorState.RULE_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..972ed87 --- /dev/null +++ b/austin-handler/src/main/java/com/java3y/austin/service/deduplication/build/FrequencyDeduplicationBuilder.java @@ -0,0 +1,34 @@ +package com.java3y.austin.service.deduplication.build; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; +import com.java3y.austin.domain.DeduplicationParam; +import com.java3y.austin.enums.AnchorState; +import com.java3y.austin.service.deduplication.build.Builder; +import org.springframework.stereotype.Service; + +import java.util.Date; + +/** + * @author huskey + * @date 2022/1/18 + */ + +@Service +public class FrequencyDeduplicationBuilder implements Builder { + + @Override + public DeduplicationParam build(String deduplication, String key) { + JSONObject object = JSONObject.parseObject(deduplication); + if (object == null) { + return null; + } + DeduplicationParam deduplicationParam = JSONObject.parseObject(object.getString(key), DeduplicationParam.class); + if (deduplicationParam == null) { + return null; + } + deduplicationParam.setDeduplicationTime((DateUtil.endOfDay(new Date()).getTime() - DateUtil.current()) / 1000); + deduplicationParam.setAnchorState(AnchorState.RULE_DEDUPLICATION); + return deduplicationParam; + } +}