From 86fe8209c7006c850daa39349c0f115c67cb4cd7 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Thu, 29 Aug 2019 16:19:24 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20#897=20=E4=BF=AE=E5=A4=8D=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E6=89=B9=E9=87=8F=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=88=90=E5=91=98=E5=90=8E=E7=9A=84=E6=8E=A8=E9=80=81=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E8=A2=AB=E8=AF=AF=E5=88=A4=E4=B8=BA=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/cp/message/WxCpMessageRouter.java | 68 +++++++------------ 1 file changed, 25 insertions(+), 43 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java index 631abdff..1eda876c 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java @@ -1,9 +1,6 @@ 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.ExecutorService; 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.session.InternalSession; 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.util.LogExceptionHandler; import me.chanjar.weixin.cp.api.WxCpService; @@ -54,9 +50,8 @@ import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage; * @author Daniel Qian */ public class WxCpMessageRouter { - 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 rules = new ArrayList<>(); private final WxCpService wxCpService; @@ -69,6 +64,9 @@ public class WxCpMessageRouter { private WxErrorExceptionHandler exceptionHandler; + /** + * 构造方法. + */ public WxCpMessageRouter(WxCpService wxCpService) { this.wxCpService = wxCpService; this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE); @@ -82,8 +80,6 @@ public class WxCpMessageRouter { * 设置自定义的 {@link ExecutorService} * 如果不调用该方法,默认使用 Executors.newFixedThreadPool(100) * - * - * @param executorService */ public void setExecutorService(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.WxMessageInMemoryDuplicateChecker} * - * - * @param messageDuplicateChecker */ public void setMessageDuplicateChecker(WxMessageDuplicateChecker messageDuplicateChecker) { this.messageDuplicateChecker = messageDuplicateChecker; @@ -106,8 +100,6 @@ public class WxCpMessageRouter { * 设置自定义的{@link me.chanjar.weixin.common.session.WxSessionManager} * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.session.StandardSessionManager} * - * - * @param sessionManager */ public void setSessionManager(WxSessionManager sessionManager) { this.sessionManager = sessionManager; @@ -118,8 +110,6 @@ public class WxCpMessageRouter { * 设置自定义的{@link me.chanjar.weixin.common.api.WxErrorExceptionHandler} * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.util.LogExceptionHandler} * - * - * @param exceptionHandler */ public void setExceptionHandler(WxErrorExceptionHandler exceptionHandler) { this.exceptionHandler = exceptionHandler; @@ -130,20 +120,17 @@ public class WxCpMessageRouter { } /** - * 开始一个新的Route规则 + * 开始一个新的Route规则. */ public WxCpMessageRouterRule rule() { return new WxCpMessageRouterRule(this); } /** - * 处理微信消息 - * - * @param wxMessage - * @param context + * 处理微信消息. */ - public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage, final Map context) { - if (isDuplicateMessage(wxMessage)) { + private WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage, final Map context) { + if (isMsgDuplicated(wxMessage)) { // 如果是重复消息,那么就不做处理 return null; } @@ -207,48 +194,43 @@ public class WxCpMessageRouter { return res; } - /** * 处理微信消息. - * */ public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage) { return this.route(wxMessage, new HashMap(2)); } - protected boolean isDuplicateMessage(WxCpXmlMessage wxMessage) { - String messageId; + private boolean isMsgDuplicated(WxCpXmlMessage wxMessage) { + StringBuilder messageId = new StringBuilder(); 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 { - messageId = new StringBuilder().append(wxMessage.getMsgId()) + messageId.append(wxMessage.getMsgId()) .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()); if (session != null) { session.endAccess(); } } - - }