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