From 7184711301806832bbc2d66b3e4045b3aab04673 Mon Sep 17 00:00:00 2001 From: Daniel Qian Date: Wed, 21 Jan 2015 19:02:47 +0800 Subject: [PATCH] refactor --- ...er.java => WxMessageDuplicateChecker.java} | 2 +- ...=> WxMessageInMemoryDuplicateChecker.java} | 6 +-- ...xMessageInMemoryDuplicateCheckerTest.java} | 4 +- .../src/test/resources/testng.xml | 2 +- .../cp/api/WxCpInMemoryConfigStorage.java | 4 +- .../weixin/cp/api/WxCpMessageRouter.java | 24 ++++----- .../mp/api/WxMpInMemoryConfigStorage.java | 3 +- .../weixin/mp/api/WxMpMessageRouter.java | 53 ++++++++++++------- 8 files changed, 54 insertions(+), 44 deletions(-) rename weixin-java-common/src/main/java/me/chanjar/weixin/common/util/{WxMsgIdDuplicateChecker.java => WxMessageDuplicateChecker.java} (89%) rename weixin-java-common/src/main/java/me/chanjar/weixin/common/util/{WxMsgIdMemoryDuplicateChecker.java => WxMessageInMemoryDuplicateChecker.java} (91%) rename weixin-java-common/src/test/java/me/chanjar/weixin/common/util/{WxMsgIdMemoryDuplicateCheckerTest.java => WxMessageInMemoryDuplicateCheckerTest.java} (82%) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxMsgIdDuplicateChecker.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxMessageDuplicateChecker.java similarity index 89% rename from weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxMsgIdDuplicateChecker.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxMessageDuplicateChecker.java index b3d320b1..21f21c5d 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxMsgIdDuplicateChecker.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxMessageDuplicateChecker.java @@ -6,7 +6,7 @@ package me.chanjar.weixin.common.util; * 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次 * */ -public interface WxMsgIdDuplicateChecker { +public interface WxMessageDuplicateChecker { /** * 检查消息ID是否重复 diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxMsgIdMemoryDuplicateChecker.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxMessageInMemoryDuplicateChecker.java similarity index 91% rename from weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxMsgIdMemoryDuplicateChecker.java rename to weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxMessageInMemoryDuplicateChecker.java index 461a245a..2dbfa611 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxMsgIdMemoryDuplicateChecker.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxMessageInMemoryDuplicateChecker.java @@ -10,7 +10,7 @@ import java.util.concurrent.atomic.AtomicBoolean; * 将每个消息id保存在内存里,每隔5秒清理已经过期的消息id,每个消息id的过期时间是15秒 * */ -public class WxMsgIdMemoryDuplicateChecker implements WxMsgIdDuplicateChecker { +public class WxMessageInMemoryDuplicateChecker implements WxMessageDuplicateChecker { /** * 一个消息ID在内存的过期时间:15秒 @@ -39,7 +39,7 @@ public class WxMsgIdMemoryDuplicateChecker implements WxMsgIdDuplicateChecker { * 每隔多少周期检查消息ID是否过期:5秒 * */ - public WxMsgIdMemoryDuplicateChecker() { + public WxMessageInMemoryDuplicateChecker() { this.timeToLive = 15 * 1000l; this.clearPeriod = 5 * 1000l; } @@ -49,7 +49,7 @@ public class WxMsgIdMemoryDuplicateChecker implements WxMsgIdDuplicateChecker { * @param timeToLive 一个消息ID在内存的过期时间:毫秒 * @param clearPeriod 每隔多少周期检查消息ID是否过期:毫秒 */ - public WxMsgIdMemoryDuplicateChecker(Long timeToLive, Long clearPeriod) { + public WxMessageInMemoryDuplicateChecker(Long timeToLive, Long clearPeriod) { this.timeToLive = timeToLive; this.clearPeriod = clearPeriod; } diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/WxMsgIdMemoryDuplicateCheckerTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/WxMessageInMemoryDuplicateCheckerTest.java similarity index 82% rename from weixin-java-common/src/test/java/me/chanjar/weixin/common/util/WxMsgIdMemoryDuplicateCheckerTest.java rename to weixin-java-common/src/test/java/me/chanjar/weixin/common/util/WxMessageInMemoryDuplicateCheckerTest.java index b75d94d5..55e99070 100644 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/WxMsgIdMemoryDuplicateCheckerTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/WxMessageInMemoryDuplicateCheckerTest.java @@ -4,11 +4,11 @@ import org.testng.Assert; import org.testng.annotations.Test; @Test -public class WxMsgIdMemoryDuplicateCheckerTest { +public class WxMessageInMemoryDuplicateCheckerTest { public void test() throws InterruptedException { Long[] msgIds = new Long[] { 1l, 2l, 3l, 4l, 5l, 6l, 7l, 8l }; - WxMsgIdMemoryDuplicateChecker checker = new WxMsgIdMemoryDuplicateChecker(2000l, 1000l); + WxMessageInMemoryDuplicateChecker checker = new WxMessageInMemoryDuplicateChecker(2000l, 1000l); // 第一次检查 for (Long msgId : msgIds) { diff --git a/weixin-java-common/src/test/resources/testng.xml b/weixin-java-common/src/test/resources/testng.xml index 47d0d0d6..984f0ae8 100644 --- a/weixin-java-common/src/test/resources/testng.xml +++ b/weixin-java-common/src/test/resources/testng.xml @@ -7,7 +7,7 @@ - + diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java index dd4882e2..0a35fcd9 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpInMemoryConfigStorage.java @@ -37,11 +37,11 @@ public class WxCpInMemoryConfigStorage implements WxCpConfigStorage { this.expiresTime = 0; } - public void updateAccessToken(WxAccessToken accessToken) { + public synchronized void updateAccessToken(WxAccessToken accessToken) { updateAccessToken(accessToken.getAccessToken(), accessToken.getExpiresIn()); } - public void updateAccessToken(String accessToken, int expiresInSeconds) { + public synchronized void updateAccessToken(String accessToken, int expiresInSeconds) { this.accessToken = accessToken; this.expiresTime = System.currentTimeMillis() + (expiresInSeconds - 200) * 1000l; } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java index 9e67d5bd..5b9cd574 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java @@ -1,7 +1,7 @@ package me.chanjar.weixin.cp.api; -import me.chanjar.weixin.common.util.WxMsgIdDuplicateChecker; -import me.chanjar.weixin.common.util.WxMsgIdMemoryDuplicateChecker; +import me.chanjar.weixin.common.util.WxMessageDuplicateChecker; +import me.chanjar.weixin.common.util.WxMessageInMemoryDuplicateChecker; import me.chanjar.weixin.cp.bean.WxCpXmlMessage; import me.chanjar.weixin.cp.bean.WxCpXmlOutMessage; @@ -43,7 +43,7 @@ import java.util.regex.Pattern; */ public class WxCpMessageRouter { - private static final int DEFAULT_THREAD_POOL_SIZE = 20; + private static final int DEFAULT_THREAD_POOL_SIZE = 100; private final List rules = new ArrayList(); @@ -51,18 +51,12 @@ public class WxCpMessageRouter { private ExecutorService executorService; - private WxMsgIdDuplicateChecker wxMsgIdDuplicateChecker; + private WxMessageDuplicateChecker wxMessageDuplicateChecker; public WxCpMessageRouter(WxCpService wxCpService) { this.wxCpService = wxCpService; this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE); - this.wxMsgIdDuplicateChecker = new WxMsgIdMemoryDuplicateChecker(); - } - - public WxCpMessageRouter(WxCpService wxMpService, int threadPoolSize) { - this.wxCpService = wxMpService; - this.executorService = Executors.newFixedThreadPool(threadPoolSize); - this.wxMsgIdDuplicateChecker = new WxMsgIdMemoryDuplicateChecker(); + this.wxMessageDuplicateChecker = new WxMessageInMemoryDuplicateChecker(); } /** @@ -75,10 +69,10 @@ public class WxCpMessageRouter { /** * 设置自定义的WxMsgIdDuplicateChecker - * @param wxMsgIdDuplicateChecker + * @param wxMessageDuplicateChecker */ - public void setWxMsgIdDuplicateChecker(WxMsgIdDuplicateChecker wxMsgIdDuplicateChecker) { - this.wxMsgIdDuplicateChecker = wxMsgIdDuplicateChecker; + public void setWxMessageDuplicateChecker(WxMessageDuplicateChecker wxMessageDuplicateChecker) { + this.wxMessageDuplicateChecker = wxMessageDuplicateChecker; } /** @@ -94,7 +88,7 @@ public class WxCpMessageRouter { * @param wxMessage */ public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage) { - if (wxMsgIdDuplicateChecker.isDuplicate(wxMessage.getMsgId())) { + if (wxMessageDuplicateChecker.isDuplicate(wxMessage.getMsgId())) { // 如果是重复消息,那么就不做处理 return null; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java index c694dde8..ff272f77 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpInMemoryConfigStorage.java @@ -152,7 +152,6 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage { this.http_proxy_password = http_proxy_password; } - @Override public String toString() { return "WxMpInMemoryConfigStorage{" + @@ -166,6 +165,8 @@ public class WxMpInMemoryConfigStorage implements WxMpConfigStorage { ", http_proxy_port=" + http_proxy_port + ", http_proxy_username='" + http_proxy_username + '\'' + ", http_proxy_password='" + http_proxy_password + '\'' + + ", jsapiTicket='" + jsapiTicket + '\'' + + ", jsapiTicketExpiresTime='" + jsapiTicketExpiresTime + '\'' + '}'; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java index f069fc8d..a46d5716 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java @@ -4,14 +4,13 @@ import me.chanjar.weixin.common.session.InternalSession; import me.chanjar.weixin.common.session.SessionManagerImpl; import me.chanjar.weixin.common.session.WxSession; import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.common.util.WxMsgIdDuplicateChecker; -import me.chanjar.weixin.common.util.WxMsgIdMemoryDuplicateChecker; +import me.chanjar.weixin.common.util.WxMessageDuplicateChecker; +import me.chanjar.weixin.common.util.WxMessageInMemoryDuplicateChecker; import me.chanjar.weixin.mp.bean.WxMpXmlMessage; import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.swing.text.StyledEditorKit; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -52,7 +51,7 @@ public class WxMpMessageRouter { protected final Logger log = LoggerFactory.getLogger(WxMpMessageRouter.class); - private static final int DEFAULT_THREAD_POOL_SIZE = 20; + private static final int DEFAULT_THREAD_POOL_SIZE = 100; private final List rules = new ArrayList(); @@ -60,24 +59,22 @@ public class WxMpMessageRouter { private ExecutorService executorService; - private WxMsgIdDuplicateChecker wxMsgIdDuplicateChecker; + private WxMessageDuplicateChecker wxMessageDuplicateChecker; - protected WxSessionManager sessionManager = new SessionManagerImpl(); + private WxSessionManager sessionManager; public WxMpMessageRouter(WxMpService wxMpService) { this.wxMpService = wxMpService; this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE); - this.wxMsgIdDuplicateChecker = new WxMsgIdMemoryDuplicateChecker(); - } - - public WxMpMessageRouter(WxMpService wxMpService, int threadPoolSize) { - this.wxMpService = wxMpService; - this.executorService = Executors.newFixedThreadPool(threadPoolSize); - this.wxMsgIdDuplicateChecker = new WxMsgIdMemoryDuplicateChecker(); + this.wxMessageDuplicateChecker = new WxMessageInMemoryDuplicateChecker(); + this.sessionManager = new SessionManagerImpl(); } /** - * 设置自定义的ExecutorService + *
+   * 设置自定义的 {@link ExecutorService}
+   * 如果不调用该方法,默认使用 Executors.newFixedThreadPool(100)
+   * 
* @param executorService */ public void setExecutorService(ExecutorService executorService) { @@ -85,11 +82,25 @@ public class WxMpMessageRouter { } /** - * 设置自定义的WxMsgIdDuplicateChecker - * @param wxMsgIdDuplicateChecker + *
+   * 设置自定义的 {@link me.chanjar.weixin.common.util.WxMessageDuplicateChecker}
+   * 如果不调用该方法,默认使用 {@link me.chanjar.weixin.common.util.WxMessageInMemoryDuplicateChecker}
+   * 
+ * @param wxMessageDuplicateChecker + */ + public void setWxMessageDuplicateChecker(WxMessageDuplicateChecker wxMessageDuplicateChecker) { + this.wxMessageDuplicateChecker = wxMessageDuplicateChecker; + } + + /** + *
+   * 设置自定义的{@link me.chanjar.weixin.common.session.WxSessionManager}
+   * 如果不调用该方法,默认使用 {@linke SessionManagerImpl}
+   * 
+ * @param sessionManager */ - public void setWxMsgIdDuplicateChecker(WxMsgIdDuplicateChecker wxMsgIdDuplicateChecker) { - this.wxMsgIdDuplicateChecker = wxMsgIdDuplicateChecker; + public void setSessionManager(WxSessionManager sessionManager) { + this.sessionManager = sessionManager; } /** @@ -105,7 +116,7 @@ public class WxMpMessageRouter { * @param wxMessage */ public WxMpXmlOutMessage route(final WxMpXmlMessage wxMessage) { - if (wxMsgIdDuplicateChecker.isDuplicate(wxMessage.getMsgId())) { + if (wxMessageDuplicateChecker.isDuplicate(wxMessage.getMsgId())) { // 如果是重复消息,那么就不做处理 return null; } @@ -167,6 +178,10 @@ public class WxMpMessageRouter { return res; } + /** + * 对session的访问结束 + * @param wxMessage + */ protected void sessionEndAccess(WxMpXmlMessage wxMessage) { WxSession session = sessionManager.getSession(wxMessage.getFromUserName(), false); if (session != null) {