위챗 푸시 메시지 배중 해결 방법
위챗 문서 원문:
일반 메시지
1. 재시도에 대한 메시지 배중, msgid 배중을 추천합니다.
2. 위챗 서버가 5초 안에 응답을 받지 못하면 연결이 끊어지고 요청을 다시 시작합니다. 총 세 번 다시 시도합니다.만약 서버가 5초 안에 처리하고 회답할 것을 보장할 수 없다면, 빈 문자열에 직접 회답할 수 있으며, 위챗 서버는 이것에 대해 어떠한 처리도 하지 않을 뿐만 아니라, 다시 시도하지 않을 것이다.
이벤트 푸시:
위챗 서버가 5초 안에 응답을 받지 못하면 연결이 끊어지고 요청을 다시 시작합니다. 총 3회 다시 시도합니다.
재시도에 대한 메시지 배열에 대해서는 FromUserName + CreateTime 배열을 사용하는 것이 좋습니다.
만약 서버가 5초 안에 처리하고 회답할 것을 보장할 수 없다면, 빈 문자열에 직접 회답할 수 있으며, 위챗 서버는 이것에 대해 어떠한 처리도 하지 않을 뿐만 아니라, 다시 시도하지 않을 것이다.
내 솔루션:
1. 중복 메시지를 판단하는 Duplicate Removal Message 클래스 만들기;
2. 위챗이 전송한 메시지 해석 값을 Duplicate Removal Message 대상의 실례에 부여한다.
3. 정적 변수list를 캐시로 삼아 Duplicate Removal Message의 실례가 캐시list에 존재하는지 판단하고 존재하면 중복 메시지, 존재하지 않으면 중복 메시지가 아닌 메시지를 캐시list에 저장합니다.
이 시나리오의 문제점:
1. 캐시list는 무한히 커지기 때문에 setMessage ToCache 방법으로list의 최대 용량을 1000으로 제한합니다.
2.list의 최대 용량은 여전히 폐단이 있다. 즉, 두 개의 중복된 메시지 사이에 999개가 넘는 Duplicate Removal Message 대상이 있으면 여전히 판단이 정확하지 않고 list 용량을 늘려서 완화할 수 밖에 없다. 이런 상황은 극단적이기 때문에 현재는 그렇게 큰 업무량이 없기 때문에 잠시 이렇게 사용한다.
여러분은 어떤 좋은 해결 방안이 있는지 함께 교류하고 벽돌을 찍는 것을 환영합니다.
다음은 구현 코드입니다.
참고: 1.다중 스레드 호출 상황을 고려하고, 방법에synchronized
2.DuplicateRemovalMessage 해시코드, equals 복사 방법 잊지 마세요
private static final int MESSAGE_CACHE_SIZE = 1000;
private static List<DuplicateRemovalMessage> MESSAGE_CACHE = new ArrayList<DuplicateRemovalMessage>(MESSAGE_CACHE_SIZE);
/**
* @Description:
* @return boolean true
*/
public static synchronized boolean isDuplicate(Map<String, String> request) {
String fromUserName = request.get("FromUserName");
String createTime = request.get("CreateTime");
String msgId = request.get("MsgId");
DuplicateRemovalMessage duplicateRemovalMessage = new DuplicateRemovalMessage();
if (msgId != null) {
duplicateRemovalMessage.setMsgId(msgId);
} else {
duplicateRemovalMessage.setCreateTime(createTime);
duplicateRemovalMessage.setFromUserName(fromUserName);
}
if (MESSAGE_CACHE.contains(duplicateRemovalMessage)) {
// , pass
return true;
} else {
setMessageToCache(duplicateRemovalMessage);
return false;
}
}
private static void setMessageToCache(DuplicateRemovalMessage duplicateRemovalMessage) {
if (MESSAGE_CACHE.size() >= MESSAGE_CACHE_SIZE) {
MESSAGE_CACHE.remove(0);
}
MESSAGE_CACHE.add(duplicateRemovalMessage);
}
DuplicateRemovalMessage 객체:
public class DuplicateRemovalMessage {
private String MsgId;
private String FromUserName;
private String CreateTime;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((CreateTime == null) ? 0 : CreateTime.hashCode());
result = prime * result + ((FromUserName == null) ? 0 : FromUserName.hashCode());
result = prime * result + ((MsgId == null) ? 0 : MsgId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DuplicateRemovalMessage other = (DuplicateRemovalMessage) obj;
if (CreateTime == null) {
if (other.CreateTime != null)
return false;
} else if (!CreateTime.equals(other.CreateTime))
return false;
if (FromUserName == null) {
if (other.FromUserName != null)
return false;
} else if (!FromUserName.equals(other.FromUserName))
return false;
if (MsgId == null) {
if (other.MsgId != null)
return false;
} else if (!MsgId.equals(other.MsgId))
return false;
return true;
}
public String getMsgId() {
return MsgId;
}
public void setMsgId(String msgId) {
MsgId = msgId;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public String getCreateTime() {
return CreateTime;
}
public void setCreateTime(String createTime) {
CreateTime = createTime;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("DuplicateRemovalMessage [MsgId=");
builder.append(MsgId);
builder.append(", FromUserName=");
builder.append(FromUserName);
builder.append(", CreateTime=");
builder.append(CreateTime);
builder.append("]");
return builder.toString();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.