From b9214902531c4320d2a43ef137b2f1160d5e184e Mon Sep 17 00:00:00 2001 From: Daniel Qian Date: Fri, 23 Jan 2015 17:20:05 +0800 Subject: [PATCH] =?UTF-8?q?issue=20#86=20handler,=20intercept=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E7=AD=BE=E5=90=8D=E6=B7=BB=E5=8A=A0throw=20WxExceptio?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/util/LogExceptionHandler.java | 19 +++++++ .../common/util/WxErrorExceptionHandler.java | 12 ++++ .../weixin/cp/api/WxCpMessageHandler.java | 3 +- .../weixin/cp/api/WxCpMessageInterceptor.java | 3 +- .../weixin/cp/api/WxCpMessageRouter.java | 49 ++++++++++++----- .../weixin/mp/api/WxMpMessageHandler.java | 3 +- .../weixin/mp/api/WxMpMessageInterceptor.java | 3 +- .../weixin/mp/api/WxMpMessageRouter.java | 55 +++++++++++++------ .../mp/demo/DemoGuessNumberHandler.java | 38 +++---------- 9 files changed, 119 insertions(+), 66 deletions(-) create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/LogExceptionHandler.java create mode 100644 weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxErrorExceptionHandler.java diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/LogExceptionHandler.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/LogExceptionHandler.java new file mode 100644 index 00000000..1fa1af75 --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/LogExceptionHandler.java @@ -0,0 +1,19 @@ +package me.chanjar.weixin.common.util; + +import me.chanjar.weixin.common.exception.WxErrorException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class LogExceptionHandler implements WxErrorExceptionHandler { + + private Logger log = LoggerFactory.getLogger(WxErrorExceptionHandler.class); + + @Override + public void handle(WxErrorException e) { + + log.error("Error happens", e); + + } + +} diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxErrorExceptionHandler.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxErrorExceptionHandler.java new file mode 100644 index 00000000..70940aef --- /dev/null +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/WxErrorExceptionHandler.java @@ -0,0 +1,12 @@ +package me.chanjar.weixin.common.util; + +import me.chanjar.weixin.common.exception.WxErrorException; + +/** + * WxErrorException处理器 + */ +public interface WxErrorExceptionHandler { + + public void handle(WxErrorException e); + +} diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageHandler.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageHandler.java index f9a3c289..e4ee9ec7 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageHandler.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageHandler.java @@ -1,5 +1,6 @@ package me.chanjar.weixin.cp.api; +import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.session.WxSession; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.cp.bean.WxCpXmlMessage; @@ -24,6 +25,6 @@ public interface WxCpMessageHandler { public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService wxCpService, - WxSessionManager sessionManager); + WxSessionManager sessionManager) throws WxErrorException; } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageInterceptor.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageInterceptor.java index 92fa41f1..f17e7954 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageInterceptor.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageInterceptor.java @@ -1,5 +1,6 @@ package me.chanjar.weixin.cp.api; +import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.cp.bean.WxCpXmlMessage; @@ -24,6 +25,6 @@ public interface WxCpMessageInterceptor { public boolean intercept(WxCpXmlMessage wxMessage, Map context, WxCpService wxCpService, - WxSessionManager sessionManager); + WxSessionManager sessionManager) throws WxErrorException; } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java index 936a2125..398add61 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java @@ -1,6 +1,9 @@ package me.chanjar.weixin.cp.api; +import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.session.*; +import me.chanjar.weixin.common.util.LogExceptionHandler; +import me.chanjar.weixin.common.util.WxErrorExceptionHandler; import me.chanjar.weixin.common.util.WxMessageDuplicateChecker; import me.chanjar.weixin.common.util.WxMessageInMemoryDuplicateChecker; import me.chanjar.weixin.cp.bean.WxCpXmlMessage; @@ -62,11 +65,14 @@ public class WxCpMessageRouter { private WxSessionManager sessionManager; + private WxErrorExceptionHandler exceptionHandler; + public WxCpMessageRouter(WxCpService wxCpService) { this.wxCpService = wxCpService; this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE); this.messageDuplicateChecker = new WxMessageInMemoryDuplicateChecker(); this.sessionManager = new StandardSessionManager(); + this.exceptionHandler = new LogExceptionHandler(); } /** @@ -143,12 +149,12 @@ public class WxCpMessageRouter { futures.add( executorService.submit(new Runnable() { public void run() { - rule.service(wxMessage, wxCpService, sessionManager); + rule.service(wxMessage, wxCpService, sessionManager, exceptionHandler); } }) ); } else { - res = rule.service(wxMessage, wxCpService, sessionManager); + res = rule.service(wxMessage, wxCpService, sessionManager, exceptionHandler); // 在同步操作结束,session访问结束 log.debug("End session access: async=false, sessionId={}", wxMessage.getFromUserName()); sessionEndAccess(wxMessage); @@ -425,22 +431,35 @@ public class WxCpMessageRouter { * @param wxMessage * @return true 代表继续执行别的router,false 代表停止执行别的router */ - protected WxCpXmlOutMessage service(WxCpXmlMessage wxMessage, WxCpService wxCpService, WxSessionManager sessionManager) { - Map context = new HashMap(); - // 如果拦截器不通过 - for (WxCpMessageInterceptor interceptor : this.interceptors) { - if (!interceptor.intercept(wxMessage, context, wxCpService, sessionManager)) { - return null; + protected WxCpXmlOutMessage service(WxCpXmlMessage wxMessage, + WxCpService wxCpService, + WxSessionManager sessionManager, + WxErrorExceptionHandler exceptionHandler) { + + try { + + Map context = new HashMap(); + // 如果拦截器不通过 + for (WxCpMessageInterceptor interceptor : this.interceptors) { + if (!interceptor.intercept(wxMessage, context, wxCpService, sessionManager)) { + return null; + } } - } - // 交给handler处理 - WxCpXmlOutMessage res = null; - for (WxCpMessageHandler handler : this.handlers) { - // 返回最后handler的结果 - res = handler.handle(wxMessage, context, wxCpService, sessionManager); + // 交给handler处理 + WxCpXmlOutMessage res = null; + for (WxCpMessageHandler handler : this.handlers) { + // 返回最后handler的结果 + res = handler.handle(wxMessage, context, wxCpService, sessionManager); + } + return res; + + } catch (WxErrorException e) { + exceptionHandler.handle(e); } - return res; + + return null; + } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageHandler.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageHandler.java index d7c30a31..0fbc589c 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageHandler.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageHandler.java @@ -1,5 +1,6 @@ package me.chanjar.weixin.mp.api; +import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.mp.bean.WxMpXmlMessage; import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; @@ -23,6 +24,6 @@ public interface WxMpMessageHandler { public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, - WxSessionManager sessionManager); + WxSessionManager sessionManager) throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageInterceptor.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageInterceptor.java index 2b68a6f2..4b60c450 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageInterceptor.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageInterceptor.java @@ -1,5 +1,6 @@ package me.chanjar.weixin.mp.api; +import me.chanjar.weixin.common.exception.WxErrorException; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.mp.bean.WxMpXmlMessage; @@ -24,6 +25,6 @@ public interface WxMpMessageInterceptor { public boolean intercept(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, - WxSessionManager sessionManager); + WxSessionManager sessionManager) throws WxErrorException; } 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 d804f59e..7ec6eb03 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 @@ -1,7 +1,12 @@ package me.chanjar.weixin.mp.api; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.session.*; +import me.chanjar.weixin.common.exception.WxErrorException; +import me.chanjar.weixin.common.session.InternalSession; +import me.chanjar.weixin.common.session.InternalSessionManager; +import me.chanjar.weixin.common.session.StandardSessionManager; +import me.chanjar.weixin.common.session.WxSessionManager; +import me.chanjar.weixin.common.util.LogExceptionHandler; +import me.chanjar.weixin.common.util.WxErrorExceptionHandler; import me.chanjar.weixin.common.util.WxMessageDuplicateChecker; import me.chanjar.weixin.common.util.WxMessageInMemoryDuplicateChecker; import me.chanjar.weixin.mp.bean.WxMpXmlMessage; @@ -61,11 +66,14 @@ public class WxMpMessageRouter { private WxSessionManager sessionManager; + private WxErrorExceptionHandler exceptionHandler; + public WxMpMessageRouter(WxMpService wxMpService) { this.wxMpService = wxMpService; this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE); this.messageDuplicateChecker = new WxMessageInMemoryDuplicateChecker(); this.sessionManager = new StandardSessionManager(); + this.exceptionHandler = new LogExceptionHandler(); } /** @@ -142,12 +150,12 @@ public class WxMpMessageRouter { futures.add( executorService.submit(new Runnable() { public void run() { - rule.service(wxMessage, wxMpService, sessionManager); + rule.service(wxMessage, wxMpService, sessionManager, exceptionHandler); } }) ); } else { - res = rule.service(wxMessage, wxMpService, sessionManager); + res = rule.service(wxMessage, wxMpService, sessionManager, exceptionHandler); // 在同步操作结束,session访问结束 log.debug("End session access: async=false, sessionId={}", wxMessage.getFromUserName()); sessionEndAccess(wxMessage); @@ -409,22 +417,33 @@ public class WxMpMessageRouter { * @param wxMessage * @return true 代表继续执行别的router,false 代表停止执行别的router */ - protected WxMpXmlOutMessage service(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) { - Map context = new HashMap(); - // 如果拦截器不通过 - for (WxMpMessageInterceptor interceptor : this.interceptors) { - if (!interceptor.intercept(wxMessage, context, wxMpService, sessionManager)) { - return null; + protected WxMpXmlOutMessage service(WxMpXmlMessage wxMessage, + WxMpService wxMpService, + WxSessionManager sessionManager, + WxErrorExceptionHandler exceptionHandler) { + + try { + + Map context = new HashMap(); + // 如果拦截器不通过 + for (WxMpMessageInterceptor interceptor : this.interceptors) { + if (!interceptor.intercept(wxMessage, context, wxMpService, sessionManager)) { + return null; + } } + + // 交给handler处理 + WxMpXmlOutMessage res = null; + for (WxMpMessageHandler handler : this.handlers) { + // 返回最后handler的结果 + res = handler.handle(wxMessage, context, wxMpService, sessionManager); + } + return res; + } catch (WxErrorException e) { + exceptionHandler.handle(e); } - - // 交给handler处理 - WxMpXmlOutMessage res = null; - for (WxMpMessageHandler handler : this.handlers) { - // 返回最后handler的结果 - res = handler.handle(wxMessage, context, wxMpService, sessionManager); - } - return res; + return null; + } } diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java index 449a735d..345ec9f2 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java @@ -35,7 +35,7 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa @Override public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, - WxSessionManager sessionManager) { + WxSessionManager sessionManager) throws WxErrorException { if (isUserWantGuess(wxMessage)) { letsGo(wxMessage, wxMpService, sessionManager); @@ -49,7 +49,7 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa } - protected void letsGo(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) { + protected void letsGo(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { WxSession session = sessionManager.getSession(wxMessage.getFromUserName()); if (session.getAttribute("guessing") == null) { WxMpCustomMessage m = WxMpCustomMessage @@ -57,22 +57,14 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa .toUser(wxMessage.getFromUserName()) .content("请猜一个100以内的数字") .build(); - try { - wxMpService.customMessageSend(m); - } catch (WxErrorException e) { - e.printStackTrace(); - } + wxMpService.customMessageSend(m); } else { WxMpCustomMessage m = WxMpCustomMessage .TEXT() .toUser(wxMessage.getFromUserName()) .content("放弃了吗?那请重新猜一个100以内的数字") .build(); - try { - wxMpService.customMessageSend(m); - } catch (WxErrorException e) { - e.printStackTrace(); - } + wxMpService.customMessageSend(m); } session.setAttribute("guessing", Boolean.TRUE); @@ -80,7 +72,7 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa } - protected void giveHint(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) { + protected void giveHint(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException { WxSession session = sessionManager.getSession(wxMessage.getFromUserName()); @@ -100,11 +92,7 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa .toUser(wxMessage.getFromUserName()) .content("小了") .build(); - try { - wxMpService.customMessageSend(m); - } catch (WxErrorException e) { - e.printStackTrace(); - } + wxMpService.customMessageSend(m); } else if (guessNumber > answer) { WxMpCustomMessage m = WxMpCustomMessage @@ -112,23 +100,15 @@ public class DemoGuessNumberHandler implements WxMpMessageHandler, WxMpMessageMa .toUser(wxMessage.getFromUserName()) .content("大了") .build(); - try { - wxMpService.customMessageSend(m); - } catch (WxErrorException e) { - e.printStackTrace(); - } + wxMpService.customMessageSend(m); } else { WxMpCustomMessage m = WxMpCustomMessage .TEXT() .toUser(wxMessage.getFromUserName()) .content("Bingo!") .build(); - try { - session.removeAttribute("guessing"); - wxMpService.customMessageSend(m); - } catch (WxErrorException e) { - e.printStackTrace(); - } + session.removeAttribute("guessing"); + wxMpService.customMessageSend(m); } }