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 9cf43b77..8350593a 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 @@ -75,6 +75,29 @@ public class WxMpMessageRouter { this.exceptionHandler = new LogExceptionHandler(); } + /** + *
+ * 使用自定义的 {@link ExecutorService} + *+ */ + public WxMpMessageRouter(WxMpService wxMpService, ExecutorService executorService) { + this.wxMpService = wxMpService; + this.executorService = executorService; + this.messageDuplicateChecker = new WxMessageInMemoryDuplicateChecker(); + this.sessionManager = new StandardSessionManager(); + this.exceptionHandler = new LogExceptionHandler(); + } + + /** + *
+ * 如果使用默认的 {@link ExecutorService},则系统退出前,应该调用该方法。 + *+ */ + public void shutDownExecutorService() { + this.executorService.shutdown(); + } + + /** *
* 设置自定义的 {@link ExecutorService} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java index 4b919a22..b9424eb0 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java @@ -8,6 +8,8 @@ import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; import org.testng.*; import org.testng.annotations.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.Map; /** @@ -67,9 +69,23 @@ public class WxMpMessageRouterTest { prepare(true, sb, router); router.route(message); Thread.sleep(500); + router.shutDownExecutorService(); Assert.assertEquals(sb.toString(), expected); } + @Test(dataProvider = "messages-1") + public void testExternalExcutorService(WxMpXmlMessage message, String expected) throws InterruptedException { + StringBuffer sb = new StringBuffer(); + ExecutorService executorService = Executors.newFixedThreadPool(100); + WxMpMessageRouter router = new WxMpMessageRouter(null, executorService); + prepare(true, sb, router); + router.route(message); + Thread.sleep(500); + executorService.shutdown(); + Assert.assertEquals(sb.toString(), expected); + } + + public void testConcurrency() throws InterruptedException { final WxMpMessageRouter router = new WxMpMessageRouter(null); router.rule().handler(new WxMpMessageHandler() {