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(); + } + } /** *