| @@ -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<WxCpMessageRouterRule> 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) | |||
| * </pre> | |||
| * | |||
| * @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} | |||
| * </pre> | |||
| * | |||
| * @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} | |||
| * </pre> | |||
| * | |||
| * @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} | |||
| * </pre> | |||
| * | |||
| * @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<String, Object> context) { | |||
| if (isDuplicateMessage(wxMessage)) { | |||
| private WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage, final Map<String, Object> 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<String, Object>(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(); | |||
| } | |||
| } | |||
| } | |||