Skip to content

Commit b921490

Browse files
committed
issue #86 handler, intercept方法签名添加throw WxException
1 parent 8ec76bd commit b921490

File tree

9 files changed

+119
-66
lines changed

9 files changed

+119
-66
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package me.chanjar.weixin.common.util;
2+
3+
import me.chanjar.weixin.common.exception.WxErrorException;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
7+
8+
public class LogExceptionHandler implements WxErrorExceptionHandler {
9+
10+
private Logger log = LoggerFactory.getLogger(WxErrorExceptionHandler.class);
11+
12+
@Override
13+
public void handle(WxErrorException e) {
14+
15+
log.error("Error happens", e);
16+
17+
}
18+
19+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package me.chanjar.weixin.common.util;
2+
3+
import me.chanjar.weixin.common.exception.WxErrorException;
4+
5+
/**
6+
* WxErrorException处理器
7+
*/
8+
public interface WxErrorExceptionHandler {
9+
10+
public void handle(WxErrorException e);
11+
12+
}

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package me.chanjar.weixin.cp.api;
22

3+
import me.chanjar.weixin.common.exception.WxErrorException;
34
import me.chanjar.weixin.common.session.WxSession;
45
import me.chanjar.weixin.common.session.WxSessionManager;
56
import me.chanjar.weixin.cp.bean.WxCpXmlMessage;
@@ -24,6 +25,6 @@ public interface WxCpMessageHandler {
2425
public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage,
2526
Map<String, Object> context,
2627
WxCpService wxCpService,
27-
WxSessionManager sessionManager);
28+
WxSessionManager sessionManager) throws WxErrorException;
2829

2930
}

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageInterceptor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package me.chanjar.weixin.cp.api;
22

3+
import me.chanjar.weixin.common.exception.WxErrorException;
34
import me.chanjar.weixin.common.session.WxSessionManager;
45
import me.chanjar.weixin.cp.bean.WxCpXmlMessage;
56

@@ -24,6 +25,6 @@ public interface WxCpMessageInterceptor {
2425
public boolean intercept(WxCpXmlMessage wxMessage,
2526
Map<String, Object> context,
2627
WxCpService wxCpService,
27-
WxSessionManager sessionManager);
28+
WxSessionManager sessionManager) throws WxErrorException;
2829

2930
}

weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package me.chanjar.weixin.cp.api;
22

3+
import me.chanjar.weixin.common.exception.WxErrorException;
34
import me.chanjar.weixin.common.session.*;
5+
import me.chanjar.weixin.common.util.LogExceptionHandler;
6+
import me.chanjar.weixin.common.util.WxErrorExceptionHandler;
47
import me.chanjar.weixin.common.util.WxMessageDuplicateChecker;
58
import me.chanjar.weixin.common.util.WxMessageInMemoryDuplicateChecker;
69
import me.chanjar.weixin.cp.bean.WxCpXmlMessage;
@@ -62,11 +65,14 @@ public class WxCpMessageRouter {
6265

6366
private WxSessionManager sessionManager;
6467

68+
private WxErrorExceptionHandler exceptionHandler;
69+
6570
public WxCpMessageRouter(WxCpService wxCpService) {
6671
this.wxCpService = wxCpService;
6772
this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE);
6873
this.messageDuplicateChecker = new WxMessageInMemoryDuplicateChecker();
6974
this.sessionManager = new StandardSessionManager();
75+
this.exceptionHandler = new LogExceptionHandler();
7076
}
7177

7278
/**
@@ -143,12 +149,12 @@ public WxCpXmlOutMessage route(final WxCpXmlMessage wxMessage) {
143149
futures.add(
144150
executorService.submit(new Runnable() {
145151
public void run() {
146-
rule.service(wxMessage, wxCpService, sessionManager);
152+
rule.service(wxMessage, wxCpService, sessionManager, exceptionHandler);
147153
}
148154
})
149155
);
150156
} else {
151-
res = rule.service(wxMessage, wxCpService, sessionManager);
157+
res = rule.service(wxMessage, wxCpService, sessionManager, exceptionHandler);
152158
// 在同步操作结束,session访问结束
153159
log.debug("End session access: async=false, sessionId={}", wxMessage.getFromUserName());
154160
sessionEndAccess(wxMessage);
@@ -425,22 +431,35 @@ protected boolean test(WxCpXmlMessage wxMessage) {
425431
* @param wxMessage
426432
* @return true 代表继续执行别的router,false 代表停止执行别的router
427433
*/
428-
protected WxCpXmlOutMessage service(WxCpXmlMessage wxMessage, WxCpService wxCpService, WxSessionManager sessionManager) {
429-
Map<String, Object> context = new HashMap<String, Object>();
430-
// 如果拦截器不通过
431-
for (WxCpMessageInterceptor interceptor : this.interceptors) {
432-
if (!interceptor.intercept(wxMessage, context, wxCpService, sessionManager)) {
433-
return null;
434+
protected WxCpXmlOutMessage service(WxCpXmlMessage wxMessage,
435+
WxCpService wxCpService,
436+
WxSessionManager sessionManager,
437+
WxErrorExceptionHandler exceptionHandler) {
438+
439+
try {
440+
441+
Map<String, Object> context = new HashMap<String, Object>();
442+
// 如果拦截器不通过
443+
for (WxCpMessageInterceptor interceptor : this.interceptors) {
444+
if (!interceptor.intercept(wxMessage, context, wxCpService, sessionManager)) {
445+
return null;
446+
}
434447
}
435-
}
436448

437-
// 交给handler处理
438-
WxCpXmlOutMessage res = null;
439-
for (WxCpMessageHandler handler : this.handlers) {
440-
// 返回最后handler的结果
441-
res = handler.handle(wxMessage, context, wxCpService, sessionManager);
449+
// 交给handler处理
450+
WxCpXmlOutMessage res = null;
451+
for (WxCpMessageHandler handler : this.handlers) {
452+
// 返回最后handler的结果
453+
res = handler.handle(wxMessage, context, wxCpService, sessionManager);
454+
}
455+
return res;
456+
457+
} catch (WxErrorException e) {
458+
exceptionHandler.handle(e);
442459
}
443-
return res;
460+
461+
return null;
462+
444463
}
445464

446465
}

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package me.chanjar.weixin.mp.api;
22

3+
import me.chanjar.weixin.common.exception.WxErrorException;
34
import me.chanjar.weixin.common.session.WxSessionManager;
45
import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
56
import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage;
@@ -23,6 +24,6 @@ public interface WxMpMessageHandler {
2324
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
2425
Map<String, Object> context,
2526
WxMpService wxMpService,
26-
WxSessionManager sessionManager);
27+
WxSessionManager sessionManager) throws WxErrorException;
2728

2829
}

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageInterceptor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package me.chanjar.weixin.mp.api;
22

3+
import me.chanjar.weixin.common.exception.WxErrorException;
34
import me.chanjar.weixin.common.session.WxSessionManager;
45
import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
56

@@ -24,6 +25,6 @@ public interface WxMpMessageInterceptor {
2425
public boolean intercept(WxMpXmlMessage wxMessage,
2526
Map<String, Object> context,
2627
WxMpService wxMpService,
27-
WxSessionManager sessionManager);
28+
WxSessionManager sessionManager) throws WxErrorException;
2829

2930
}

weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
package me.chanjar.weixin.mp.api;
22

3-
import me.chanjar.weixin.common.api.WxConsts;
4-
import me.chanjar.weixin.common.session.*;
3+
import me.chanjar.weixin.common.exception.WxErrorException;
4+
import me.chanjar.weixin.common.session.InternalSession;
5+
import me.chanjar.weixin.common.session.InternalSessionManager;
6+
import me.chanjar.weixin.common.session.StandardSessionManager;
7+
import me.chanjar.weixin.common.session.WxSessionManager;
8+
import me.chanjar.weixin.common.util.LogExceptionHandler;
9+
import me.chanjar.weixin.common.util.WxErrorExceptionHandler;
510
import me.chanjar.weixin.common.util.WxMessageDuplicateChecker;
611
import me.chanjar.weixin.common.util.WxMessageInMemoryDuplicateChecker;
712
import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
@@ -61,11 +66,14 @@ public class WxMpMessageRouter {
6166

6267
private WxSessionManager sessionManager;
6368

69+
private WxErrorExceptionHandler exceptionHandler;
70+
6471
public WxMpMessageRouter(WxMpService wxMpService) {
6572
this.wxMpService = wxMpService;
6673
this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE);
6774
this.messageDuplicateChecker = new WxMessageInMemoryDuplicateChecker();
6875
this.sessionManager = new StandardSessionManager();
76+
this.exceptionHandler = new LogExceptionHandler();
6977
}
7078

7179
/**
@@ -142,12 +150,12 @@ public WxMpXmlOutMessage route(final WxMpXmlMessage wxMessage) {
142150
futures.add(
143151
executorService.submit(new Runnable() {
144152
public void run() {
145-
rule.service(wxMessage, wxMpService, sessionManager);
153+
rule.service(wxMessage, wxMpService, sessionManager, exceptionHandler);
146154
}
147155
})
148156
);
149157
} else {
150-
res = rule.service(wxMessage, wxMpService, sessionManager);
158+
res = rule.service(wxMessage, wxMpService, sessionManager, exceptionHandler);
151159
// 在同步操作结束,session访问结束
152160
log.debug("End session access: async=false, sessionId={}", wxMessage.getFromUserName());
153161
sessionEndAccess(wxMessage);
@@ -409,22 +417,33 @@ protected boolean test(WxMpXmlMessage wxMessage) {
409417
* @param wxMessage
410418
* @return true 代表继续执行别的router,false 代表停止执行别的router
411419
*/
412-
protected WxMpXmlOutMessage service(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) {
413-
Map<String, Object> context = new HashMap<String, Object>();
414-
// 如果拦截器不通过
415-
for (WxMpMessageInterceptor interceptor : this.interceptors) {
416-
if (!interceptor.intercept(wxMessage, context, wxMpService, sessionManager)) {
417-
return null;
420+
protected WxMpXmlOutMessage service(WxMpXmlMessage wxMessage,
421+
WxMpService wxMpService,
422+
WxSessionManager sessionManager,
423+
WxErrorExceptionHandler exceptionHandler) {
424+
425+
try {
426+
427+
Map<String, Object> context = new HashMap<String, Object>();
428+
// 如果拦截器不通过
429+
for (WxMpMessageInterceptor interceptor : this.interceptors) {
430+
if (!interceptor.intercept(wxMessage, context, wxMpService, sessionManager)) {
431+
return null;
432+
}
418433
}
434+
435+
// 交给handler处理
436+
WxMpXmlOutMessage res = null;
437+
for (WxMpMessageHandler handler : this.handlers) {
438+
// 返回最后handler的结果
439+
res = handler.handle(wxMessage, context, wxMpService, sessionManager);
440+
}
441+
return res;
442+
} catch (WxErrorException e) {
443+
exceptionHandler.handle(e);
419444
}
420-
421-
// 交给handler处理
422-
WxMpXmlOutMessage res = null;
423-
for (WxMpMessageHandler handler : this.handlers) {
424-
// 返回最后handler的结果
425-
res = handler.handle(wxMessage, context, wxMpService, sessionManager);
426-
}
427-
return res;
445+
return null;
446+
428447
}
429448

430449
}

weixin-java-mp/src/test/java/me/chanjar/weixin/mp/demo/DemoGuessNumberHandler.java

Lines changed: 9 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ private boolean isUserAnswering(WxMpXmlMessage message) {
3535

3636
@Override
3737
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService,
38-
WxSessionManager sessionManager) {
38+
WxSessionManager sessionManager) throws WxErrorException {
3939

4040
if (isUserWantGuess(wxMessage)) {
4141
letsGo(wxMessage, wxMpService, sessionManager);
@@ -49,38 +49,30 @@ public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> co
4949

5050
}
5151

52-
protected void letsGo(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) {
52+
protected void letsGo(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
5353
WxSession session = sessionManager.getSession(wxMessage.getFromUserName());
5454
if (session.getAttribute("guessing") == null) {
5555
WxMpCustomMessage m = WxMpCustomMessage
5656
.TEXT()
5757
.toUser(wxMessage.getFromUserName())
5858
.content("请猜一个100以内的数字")
5959
.build();
60-
try {
61-
wxMpService.customMessageSend(m);
62-
} catch (WxErrorException e) {
63-
e.printStackTrace();
64-
}
60+
wxMpService.customMessageSend(m);
6561
} else {
6662
WxMpCustomMessage m = WxMpCustomMessage
6763
.TEXT()
6864
.toUser(wxMessage.getFromUserName())
6965
.content("放弃了吗?那请重新猜一个100以内的数字")
7066
.build();
71-
try {
72-
wxMpService.customMessageSend(m);
73-
} catch (WxErrorException e) {
74-
e.printStackTrace();
75-
}
67+
wxMpService.customMessageSend(m);
7668
}
7769

7870
session.setAttribute("guessing", Boolean.TRUE);
7971
session.setAttribute("number", random.nextInt(100));
8072
}
8173

8274

83-
protected void giveHint(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) {
75+
protected void giveHint(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSessionManager sessionManager) throws WxErrorException {
8476

8577
WxSession session = sessionManager.getSession(wxMessage.getFromUserName());
8678

@@ -100,35 +92,23 @@ protected void giveHint(WxMpXmlMessage wxMessage, WxMpService wxMpService, WxSes
10092
.toUser(wxMessage.getFromUserName())
10193
.content("小了")
10294
.build();
103-
try {
104-
wxMpService.customMessageSend(m);
105-
} catch (WxErrorException e) {
106-
e.printStackTrace();
107-
}
95+
wxMpService.customMessageSend(m);
10896

10997
} else if (guessNumber > answer) {
11098
WxMpCustomMessage m = WxMpCustomMessage
11199
.TEXT()
112100
.toUser(wxMessage.getFromUserName())
113101
.content("大了")
114102
.build();
115-
try {
116-
wxMpService.customMessageSend(m);
117-
} catch (WxErrorException e) {
118-
e.printStackTrace();
119-
}
103+
wxMpService.customMessageSend(m);
120104
} else {
121105
WxMpCustomMessage m = WxMpCustomMessage
122106
.TEXT()
123107
.toUser(wxMessage.getFromUserName())
124108
.content("Bingo!")
125109
.build();
126-
try {
127-
session.removeAttribute("guessing");
128-
wxMpService.customMessageSend(m);
129-
} catch (WxErrorException e) {
130-
e.printStackTrace();
131-
}
110+
session.removeAttribute("guessing");
111+
wxMpService.customMessageSend(m);
132112
}
133113

134114
}

0 commit comments

Comments
 (0)