Merge branch 'pr_8'

pull/4/head
3y 2 years ago
commit b9a20115d7

@ -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<Integer> getDeduplicationList() {
ArrayList<Integer> result = new ArrayList<>();
for (DeduplicationType value : DeduplicationType.values()) {
result.add(value.getCode());
}
return result;
}
}

@ -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;
}

@ -44,7 +44,7 @@ public class Task implements Runnable {
return;
}
// 1.平台通用去重
// 1.平台通用去重 test
deduplicationRuleService.duplication(taskInfo);
// 2. 真正发送消息

@ -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<Integer, Builder> builderHolder = new HashMap<>(4);
private Map<Integer, DeduplicationService> 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);
}
}

@ -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<Integer> deduplicationList = DeduplicationType.getDeduplicationList();
for (Integer deduplicationType : deduplicationList) {
DeduplicationParam deduplicationParam = deduplicationHolder.selectBuilder(deduplicationType).build(deduplicationConfig, taskInfo);
if (deduplicationParam != null) {
deduplicationHolder.selectService(deduplicationType).deduplication(deduplicationParam);
}
}
}
}

@ -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;
}
}

@ -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);
}

@ -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;
}
}

@ -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;
}
}

@ -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<String> filterReceiver = new HashSet<>(taskInfo.getReceiver().size());

@ -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
* <p>

@ -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);
}

@ -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";
/**
Loading…
Cancel
Save