浏览代码

🐛 #897 修复企业微信批量删除成员后的推送消息被误判为重复消息的问题

master
Binary Wang 5 年前
父节点
当前提交
86fe8209c7
共有 1 个文件被更改,包括 25 次插入43 次删除
  1. +25
    -43
      weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java

+ 25
- 43
weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java 查看文件

@@ -1,9 +1,6 @@
package me.chanjar.weixin.cp.message; package me.chanjar.weixin.cp.message;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
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) {
if (isDuplicateMessage(wxMessage)) {
private WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage, final Map<String, Object> context) {
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) {
String messageId;
private boolean isMsgDuplicated(WxCpXmlMessage wxMessage) {
StringBuilder messageId = new StringBuilder();
if (wxMessage.getMsgId() == null) { if (wxMessage.getMsgId() == null) {
messageId = String.valueOf(wxMessage.getCreateTime())
+ "-" + StringUtils.trimToEmpty(String.valueOf(wxMessage.getAgentId()))
+ "-" + wxMessage.getFromUserName()
+ "-" + StringUtils.trimToEmpty(wxMessage.getEventKey())
+ "-" + StringUtils.trimToEmpty(wxMessage.getEvent())
;
messageId.append(wxMessage.getCreateTime())
.append("-").append(StringUtils.trimToEmpty(String.valueOf(wxMessage.getAgentId())))
.append("-").append(wxMessage.getFromUserName())
.append("-").append(StringUtils.trimToEmpty(wxMessage.getEventKey()))
.append("-").append(StringUtils.trimToEmpty(wxMessage.getEvent()));
} else { } else {
messageId = new StringBuilder().append(wxMessage.getMsgId())
messageId.append(wxMessage.getMsgId())
.append("-").append(wxMessage.getCreateTime()) .append("-").append(wxMessage.getCreateTime())
.append("-").append(wxMessage.getFromUserName())
.toString();
.append("-").append(wxMessage.getFromUserName());
}

if (StringUtils.isNotEmpty(wxMessage.getUserId())) {
messageId.append("-").append(wxMessage.getUserId());
} }


return this.messageDuplicateChecker.isDuplicate(messageId);
return this.messageDuplicateChecker.isDuplicate(messageId.toString());


} }


/** /**
* 对session的访问结束
*
* @param wxMessage
* 对session的访问结束.
*/ */
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();
} }


} }


} }

正在加载...
取消
保存