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 a0464a725..b2327bdc6 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 class WxCpMessageRouter { 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 @@ public class WxCpMessageRouter {
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 5b045082a..70ad0a64d 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 class WxCpTpMessageRouter {
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 class WxCpTpMessageRouter {
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 263305c0d..4a2291050 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 class WxMpMessageRouter {
}
/**
- * 如果使用默认的 {@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();
+ }
+ }
/**
*