From 9eaa360d34579cc953b2f8f4a0be23f14347db64 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 10 Apr 2022 23:41:08 +0800 Subject: [PATCH 1/2] =?UTF-8?q?:memo:=20=E6=9B=B4=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index df517de764..a0047e9ca9 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ ### 重要信息 1. 项目合作洽谈,请联系微信`binary0000`(在微信里自行搜索并添加好友即可,请注明来意)。 -2. **2021-11-01 发布 [【4.2.0正式版】](https://mp.weixin.qq.com/s/nIk_xOf6dxkhKfqq830Cuw)**! +2. **2022-4-10 发布 [【4.3.0正式版】](https://mp.weixin.qq.com/s/nIk_xOf6dxkhKfqq830Cuw)**! 3. 贡献源码可以参考视频:[【贡献源码全过程(上集)】](https://mp.weixin.qq.com/s/3xUZSATWwHR_gZZm207h7Q)、[【贡献源码全过程(下集)】](https://mp.weixin.qq.com/s/nyzJwVVoYSJ4hSbwyvTx9A) ,友情提供:[程序员小山与Bug](https://space.bilibili.com/473631007) 4. 新手重要提示:本项目仅是一个SDK开发工具包,未提供Web实现,建议使用 `maven` 或 `gradle` 引用本项目即可使用本SDK提供的各种功能,详情可参考 **[【Demo项目】](demo.md)** 或本项目中的部分单元测试代码;另外微信开发新手请务必阅读[【开发文档 Wiki 首页】](https://github.com/Wechat-Group/WxJava/wiki)的常见问题部分,可以少走很多弯路,节省不少时间。 5. 技术交流群:想获得QQ群/微信群/钉钉企业群等信息的同学,请使用微信扫描上面的微信公众号二维码关注 `WxJava` 后点击相关菜单即可获取加入方式,同时也可以在微信中搜索 `weixin-java-tools` 或 `WxJava` 后选择正确的公众号进行关注,该公众号会及时通知SDK相关更新信息,并不定期分享微信Java开发相关技术知识; From 5610e4b158bfb750d84d1ce2386b242aaa48349a Mon Sep 17 00:00:00 2001 From: vishun Date: Mon, 11 Apr 2022 11:59:50 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=81=E4=BC=81=E4=B8=9A=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E7=AC=AC=E4=B8=89=E6=96=B9=E7=9A=84=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=B1=A0=E5=85=B3=E9=97=AD=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E5=BD=93=E9=80=9A=E8=BF=87http=E4=BC=98=E9=9B=85?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E6=97=B6=E9=9C=80=E8=A6=81=E8=B0=83=E7=94=A8?= =?UTF-8?q?=EF=BC=8C=E5=90=A6=E5=88=99java=E8=BF=9B=E7=A8=8B=E4=B8=8D?= =?UTF-8?q?=E4=BC=9A=E7=BB=93=E6=9D=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/cp/message/WxCpMessageRouter.java | 39 +++++++++- .../cp/tp/message/WxCpTpMessageRouter.java | 78 +++++++++++++------ .../weixin/mp/api/WxMpMessageRouter.java | 18 ++++- 3 files changed, 110 insertions(+), 25 deletions(-) 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();
+    }
+  }
 
   /**
    *