mirror of
https://gitee.com/binary/weixin-java-tools.git
synced 2025-08-24 16:18:51 +08:00
🐛 #897 修复企业微信批量删除成员后的推送消息被误判为重复消息的问题
This commit is contained in:
parent
ccbbf8c01a
commit
86fe8209c7
@ -1,9 +1,6 @@
|
|||||||
package me.chanjar.weixin.cp.message;
|
package me.chanjar.weixin.cp.message;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
@ -18,7 +15,6 @@ import me.chanjar.weixin.common.api.WxMessageDuplicateChecker;
|
|||||||
import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker;
|
import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker;
|
||||||
import me.chanjar.weixin.common.session.InternalSession;
|
import me.chanjar.weixin.common.session.InternalSession;
|
||||||
import me.chanjar.weixin.common.session.InternalSessionManager;
|
import me.chanjar.weixin.common.session.InternalSessionManager;
|
||||||
import me.chanjar.weixin.common.session.StandardSessionManager;
|
|
||||||
import me.chanjar.weixin.common.session.WxSessionManager;
|
import me.chanjar.weixin.common.session.WxSessionManager;
|
||||||
import me.chanjar.weixin.common.util.LogExceptionHandler;
|
import me.chanjar.weixin.common.util.LogExceptionHandler;
|
||||||
import me.chanjar.weixin.cp.api.WxCpService;
|
import me.chanjar.weixin.cp.api.WxCpService;
|
||||||
@ -54,9 +50,8 @@ import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage;
|
|||||||
* @author Daniel Qian
|
* @author Daniel Qian
|
||||||
*/
|
*/
|
||||||
public class WxCpMessageRouter {
|
public class WxCpMessageRouter {
|
||||||
|
|
||||||
private static final int DEFAULT_THREAD_POOL_SIZE = 100;
|
private static final int DEFAULT_THREAD_POOL_SIZE = 100;
|
||||||
protected final Logger log = LoggerFactory.getLogger(WxCpMessageRouter.class);
|
private final Logger log = LoggerFactory.getLogger(WxCpMessageRouter.class);
|
||||||
private final List<WxCpMessageRouterRule> rules = new ArrayList<>();
|
private final List<WxCpMessageRouterRule> rules = new ArrayList<>();
|
||||||
|
|
||||||
private final WxCpService wxCpService;
|
private final WxCpService wxCpService;
|
||||||
@ -69,6 +64,9 @@ public class WxCpMessageRouter {
|
|||||||
|
|
||||||
private WxErrorExceptionHandler exceptionHandler;
|
private WxErrorExceptionHandler exceptionHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造方法.
|
||||||
|
*/
|
||||||
public WxCpMessageRouter(WxCpService wxCpService) {
|
public WxCpMessageRouter(WxCpService wxCpService) {
|
||||||
this.wxCpService = wxCpService;
|
this.wxCpService = wxCpService;
|
||||||
this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE);
|
this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE);
|
||||||
@ -82,8 +80,6 @@ public class WxCpMessageRouter {
|
|||||||
* 设置自定义的 {@link ExecutorService}
|
* 设置自定义的 {@link ExecutorService}
|
||||||
* 如果不调用该方法,默认使用 Executors.newFixedThreadPool(100)
|
* 如果不调用该方法,默认使用 Executors.newFixedThreadPool(100)
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
|
||||||
* @param executorService
|
|
||||||
*/
|
*/
|
||||||
public void setExecutorService(ExecutorService executorService) {
|
public void setExecutorService(ExecutorService executorService) {
|
||||||
this.executorService = executorService;
|
this.executorService = executorService;
|
||||||
@ -94,8 +90,6 @@ public class WxCpMessageRouter {
|
|||||||
* 设置自定义的 {@link me.chanjar.weixin.common.api.WxMessageDuplicateChecker}
|
* 设置自定义的 {@link me.chanjar.weixin.common.api.WxMessageDuplicateChecker}
|
||||||
* 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker}
|
* 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker}
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
|
||||||
* @param messageDuplicateChecker
|
|
||||||
*/
|
*/
|
||||||
public void setMessageDuplicateChecker(WxMessageDuplicateChecker messageDuplicateChecker) {
|
public void setMessageDuplicateChecker(WxMessageDuplicateChecker messageDuplicateChecker) {
|
||||||
this.messageDuplicateChecker = messageDuplicateChecker;
|
this.messageDuplicateChecker = messageDuplicateChecker;
|
||||||
@ -106,8 +100,6 @@ public class WxCpMessageRouter {
|
|||||||
* 设置自定义的{@link me.chanjar.weixin.common.session.WxSessionManager}
|
* 设置自定义的{@link me.chanjar.weixin.common.session.WxSessionManager}
|
||||||
* 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.session.StandardSessionManager}
|
* 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.session.StandardSessionManager}
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
|
||||||
* @param sessionManager
|
|
||||||
*/
|
*/
|
||||||
public void setSessionManager(WxSessionManager sessionManager) {
|
public void setSessionManager(WxSessionManager sessionManager) {
|
||||||
this.sessionManager = sessionManager;
|
this.sessionManager = sessionManager;
|
||||||
@ -118,8 +110,6 @@ public class WxCpMessageRouter {
|
|||||||
* 设置自定义的{@link me.chanjar.weixin.common.api.WxErrorExceptionHandler}
|
* 设置自定义的{@link me.chanjar.weixin.common.api.WxErrorExceptionHandler}
|
||||||
* 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.util.LogExceptionHandler}
|
* 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.util.LogExceptionHandler}
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
|
||||||
* @param exceptionHandler
|
|
||||||
*/
|
*/
|
||||||
public void setExceptionHandler(WxErrorExceptionHandler exceptionHandler) {
|
public void setExceptionHandler(WxErrorExceptionHandler exceptionHandler) {
|
||||||
this.exceptionHandler = exceptionHandler;
|
this.exceptionHandler = exceptionHandler;
|
||||||
@ -130,20 +120,17 @@ public class WxCpMessageRouter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开始一个新的Route规则
|
* 开始一个新的Route规则.
|
||||||
*/
|
*/
|
||||||
public WxCpMessageRouterRule rule() {
|
public WxCpMessageRouterRule rule() {
|
||||||
return new WxCpMessageRouterRule(this);
|
return new WxCpMessageRouterRule(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理微信消息
|
* 处理微信消息.
|
||||||
*
|
|
||||||
* @param wxMessage
|
|
||||||
* @param context
|
|
||||||
*/
|
*/
|
||||||
public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage, final Map<String, Object> context) {
|
private WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage, final Map<String, Object> context) {
|
||||||
if (isDuplicateMessage(wxMessage)) {
|
if (isMsgDuplicated(wxMessage)) {
|
||||||
// 如果是重复消息,那么就不做处理
|
// 如果是重复消息,那么就不做处理
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -207,48 +194,43 @@ public class WxCpMessageRouter {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理微信消息.
|
* 处理微信消息.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage) {
|
public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage) {
|
||||||
return this.route(wxMessage, new HashMap<String, Object>(2));
|
return this.route(wxMessage, new HashMap<String, Object>(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isDuplicateMessage(WxCpXmlMessage wxMessage) {
|
private boolean isMsgDuplicated(WxCpXmlMessage wxMessage) {
|
||||||
String messageId;
|
StringBuilder messageId = new StringBuilder();
|
||||||
if (wxMessage.getMsgId() == null) {
|
if (wxMessage.getMsgId() == null) {
|
||||||
messageId = String.valueOf(wxMessage.getCreateTime())
|
messageId.append(wxMessage.getCreateTime())
|
||||||
+ "-" + StringUtils.trimToEmpty(String.valueOf(wxMessage.getAgentId()))
|
.append("-").append(StringUtils.trimToEmpty(String.valueOf(wxMessage.getAgentId())))
|
||||||
+ "-" + wxMessage.getFromUserName()
|
|
||||||
+ "-" + StringUtils.trimToEmpty(wxMessage.getEventKey())
|
|
||||||
+ "-" + StringUtils.trimToEmpty(wxMessage.getEvent())
|
|
||||||
;
|
|
||||||
} else {
|
|
||||||
messageId = new StringBuilder().append(wxMessage.getMsgId())
|
|
||||||
.append("-").append(wxMessage.getCreateTime())
|
|
||||||
.append("-").append(wxMessage.getFromUserName())
|
.append("-").append(wxMessage.getFromUserName())
|
||||||
.toString();
|
.append("-").append(StringUtils.trimToEmpty(wxMessage.getEventKey()))
|
||||||
|
.append("-").append(StringUtils.trimToEmpty(wxMessage.getEvent()));
|
||||||
|
} else {
|
||||||
|
messageId.append(wxMessage.getMsgId())
|
||||||
|
.append("-").append(wxMessage.getCreateTime())
|
||||||
|
.append("-").append(wxMessage.getFromUserName());
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.messageDuplicateChecker.isDuplicate(messageId);
|
if (StringUtils.isNotEmpty(wxMessage.getUserId())) {
|
||||||
|
messageId.append("-").append(wxMessage.getUserId());
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.messageDuplicateChecker.isDuplicate(messageId.toString());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 对session的访问结束
|
* 对session的访问结束.
|
||||||
*
|
|
||||||
* @param wxMessage
|
|
||||||
*/
|
*/
|
||||||
protected void sessionEndAccess(WxCpXmlMessage wxMessage) {
|
private void sessionEndAccess(WxCpXmlMessage wxMessage) {
|
||||||
|
|
||||||
InternalSession session = ((InternalSessionManager) this.sessionManager).findSession(wxMessage.getFromUserName());
|
InternalSession session = ((InternalSessionManager) this.sessionManager).findSession(wxMessage.getFromUserName());
|
||||||
if (session != null) {
|
if (session != null) {
|
||||||
session.endAccess();
|
session.endAccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user