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 a0464a7252..b2327bdc6b 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 @@ -76,6 +76,41 @@ public WxCpMessageRouter(WxCpService wxCpService) { this.exceptionHandler = new LogExceptionHandler(); } + /** + * 使用自定义的 {@link ExecutorService}. + */ + public WxCpMessageRouter(WxCpService wxMpService, ExecutorService executorService) { + this.wxCpService = wxMpService; + this.executorService = executorService; + this.messageDuplicateChecker = new WxMessageInMemoryDuplicateChecker(); + this.sessionManager = wxCpService.getSessionManager(); + this.exceptionHandler = new LogExceptionHandler(); + } + + /** + * 系统退出前,应该调用该方法 + */ + public void shutDownExecutorService() { + this.executorService.shutdown(); + } + + /** + * 系统退出前,应该调用该方法,增加了超时时间检测 + */ + public void shutDownExecutorService(Integer second) { + this.executorService.shutdown(); + try { + if (!this.executorService.awaitTermination(second, TimeUnit.SECONDS)) { + this.executorService.shutdownNow(); + if (!this.executorService.awaitTermination(second, TimeUnit.SECONDS)) + log.error("线程池未关闭!"); + } + } catch (InterruptedException ie) { + this.executorService.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + /** *
    * 设置自定义的 {@link ExecutorService}
@@ -219,8 +254,8 @@ private boolean isMsgDuplicated(WxCpXmlMessage wxMessage) {
     return this.messageDuplicateChecker.isDuplicate(messageId.toString());
   }
 
-  private void append(StringBuilder sb, String value){
-    if(StringUtils.isNotEmpty(value)){
+  private void append(StringBuilder sb, String value) {
+    if (StringUtils.isNotEmpty(value)) {
       sb.append("-").append(value);
     }
   }
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageRouter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageRouter.java
index 5b045082a8..70ad0a64d3 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageRouter.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/message/WxCpTpMessageRouter.java
@@ -78,6 +78,41 @@ public WxCpTpMessageRouter(WxCpTpService wxCpTpService) {
     this.exceptionHandler = new LogExceptionHandler();
   }
 
+  /**
+   * 使用自定义的 {@link ExecutorService}.
+   */
+  public WxCpTpMessageRouter(WxCpTpService wxCpTpService, ExecutorService executorService) {
+    this.wxCpTpService = wxCpTpService;
+    this.executorService = executorService;
+    this.messageDuplicateChecker = new WxMessageInMemoryDuplicateChecker();
+    this.sessionManager = wxCpTpService.getSessionManager();
+    this.exceptionHandler = new LogExceptionHandler();
+  }
+
+  /**
+   * 系统退出前,应该调用该方法
+   */
+  public void shutDownExecutorService() {
+    this.executorService.shutdown();
+  }
+
+  /**
+   * 系统退出前,应该调用该方法,增加了超时时间检测
+   */
+  public void shutDownExecutorService(Integer second) {
+    this.executorService.shutdown();
+    try {
+      if (!this.executorService.awaitTermination(second, TimeUnit.SECONDS)) {
+        this.executorService.shutdownNow();
+        if (!this.executorService.awaitTermination(second, TimeUnit.SECONDS))
+          log.error("线程池未关闭!");
+      }
+    } catch (InterruptedException ie) {
+      this.executorService.shutdownNow();
+      Thread.currentThread().interrupt();
+    }
+  }
+
   /**
    * 
    * 设置自定义的 {@link ExecutorService}
@@ -200,30 +235,29 @@ public WxCpXmlOutMessage route(final WxCpTpXmlMessage wxMessage) {
 
   private boolean isMsgDuplicated(WxCpTpXmlMessage wxMessage) {
     StringBuilder messageId = new StringBuilder();
-      if (wxMessage.getInfoType() != null) {
-        messageId.append(wxMessage.getInfoType())
-          .append("-").append(StringUtils.trimToEmpty(wxMessage.getSuiteId()))
-          .append("-").append(wxMessage.getTimeStamp())
-          .append("-").append(StringUtils.trimToEmpty(wxMessage.getAuthCorpId()))
-          .append("-").append(StringUtils.trimToEmpty(wxMessage.getUserID()))
-          .append("-").append(StringUtils.trimToEmpty(wxMessage.getChangeType()))
-          .append("-").append(StringUtils.trimToEmpty(wxMessage.getServiceCorpId()));
-      }
+    if (wxMessage.getInfoType() != null) {
+      messageId.append(wxMessage.getInfoType())
+        .append("-").append(StringUtils.trimToEmpty(wxMessage.getSuiteId()))
+        .append("-").append(wxMessage.getTimeStamp())
+        .append("-").append(StringUtils.trimToEmpty(wxMessage.getAuthCorpId()))
+        .append("-").append(StringUtils.trimToEmpty(wxMessage.getUserID()))
+        .append("-").append(StringUtils.trimToEmpty(wxMessage.getChangeType()))
+        .append("-").append(StringUtils.trimToEmpty(wxMessage.getServiceCorpId()));
+    }
 
-      if (wxMessage.getMsgType() != null) {
-        if (wxMessage.getMsgId() != null) {
-          messageId.append(wxMessage.getMsgId())
-            .append("-").append(wxMessage.getCreateTime())
-            .append("-").append(wxMessage.getFromUserName());
-        }
-        else {
-          messageId.append(wxMessage.getMsgType())
-            .append("-").append(wxMessage.getCreateTime())
-            .append("-").append(wxMessage.getFromUserName())
-            .append("-").append(StringUtils.trimToEmpty(wxMessage.getEvent()))
-            .append("-").append(StringUtils.trimToEmpty(wxMessage.getEventKey()));
-        }
+    if (wxMessage.getMsgType() != null) {
+      if (wxMessage.getMsgId() != null) {
+        messageId.append(wxMessage.getMsgId())
+          .append("-").append(wxMessage.getCreateTime())
+          .append("-").append(wxMessage.getFromUserName());
+      } else {
+        messageId.append(wxMessage.getMsgType())
+          .append("-").append(wxMessage.getCreateTime())
+          .append("-").append(wxMessage.getFromUserName())
+          .append("-").append(StringUtils.trimToEmpty(wxMessage.getEvent()))
+          .append("-").append(StringUtils.trimToEmpty(wxMessage.getEventKey()));
       }
+    }
 
     return this.messageDuplicateChecker.isDuplicate(messageId.toString());
   }
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 263305c0d0..4a2291050c 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
@@ -89,12 +89,28 @@ public WxMpMessageRouter(WxMpService wxMpService, ExecutorService executorServic
   }
 
   /**
-   * 如果使用默认的 {@link ExecutorService},则系统退出前,应该调用该方法.
+   * 系统退出前,应该调用该方法
    */
   public void shutDownExecutorService() {
     this.executorService.shutdown();
   }
 
+  /**
+   * 系统退出前,应该调用该方法,增加了超时时间检测
+   */
+  public void shutDownExecutorService(Integer second) {
+    this.executorService.shutdown();
+    try {
+      if (!this.executorService.awaitTermination(second, TimeUnit.SECONDS)) {
+        this.executorService.shutdownNow();
+        if (!this.executorService.awaitTermination(second, TimeUnit.SECONDS))
+          log.error("线程池未关闭!");
+      }
+    } catch (InterruptedException ie) {
+      this.executorService.shutdownNow();
+      Thread.currentThread().interrupt();
+    }
+  }
 
   /**
    *