1
0
mirror of synced 2026-10-17 12:56:15 +08:00

issue #8 添加同步回复消息的支持

This commit is contained in:
Daniel Qian
2014-08-26 21:25:59 +08:00
parent dad826b0e6
commit 706230da50
4 changed files with 136 additions and 31 deletions

View File

@@ -4,6 +4,8 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import chanjarster.weixin.bean.WxXmlMessage;
@@ -37,8 +39,10 @@ import chanjarster.weixin.bean.WxXmlMessage;
*/
public class WxMessageRouter {
private List<Rule> rules = new ArrayList<Rule>();
private final List<Rule> rules = new ArrayList<Rule>();
private final ExecutorService es = Executors.newCachedThreadPool();
/**
* 开始一个新的Route规则
* @return
@@ -51,21 +55,52 @@ public class WxMessageRouter {
* 处理微信消息
* @param wxMessage
*/
public void route(WxXmlMessage wxMessage) {
for (Rule rule : rules) {
public WxXmlMessage route(final WxXmlMessage wxMessage) {
final List<Rule> matchRules = new ArrayList<Rule>();
// 收集匹配的规则
for (final Rule rule : rules) {
if (rule.test(wxMessage)) {
rule.service(wxMessage);
if(!rule.reEnter) {
break;
}
matchRules.add(rule);
}
}
if (matchRules.size() == 0) {
return null;
}
if (matchRules.get(0).async) {
// 只要第一个是异步的,那就异步执行
// 在另一个线程里执行
es.submit(new Runnable() {
public void run() {
for (final Rule rule : matchRules) {
rule.service(wxMessage);
if (!rule.reEnter) {
break;
}
}
}
});
return null;
}
WxXmlMessage res = null;
for (final Rule rule : matchRules) {
// 返回最后一个匹配规则的结果
res = rule.service(wxMessage);
if (!rule.reEnter) {
break;
}
}
return res;
}
public static class Rule {
private final WxMessageRouter routerBuilder;
private boolean async = true;
private String msgType;
private String event;
@@ -84,6 +119,16 @@ public class WxMessageRouter {
this.routerBuilder = routerBuilder;
}
/**
* 设置是否异步执行,默认是true
* @param async
* @return
*/
public Rule async(boolean async) {
this.async = async;
return this;
}
/**
* 如果msgType等于某值
* @param msgType
@@ -209,21 +254,22 @@ public class WxMessageRouter {
* @param wxMessage
* @return true 代表继续执行别的router,false 代表停止执行别的router
*/
protected void service(WxXmlMessage wxMessage) {
protected WxXmlMessage service(WxXmlMessage wxMessage) {
Map<String, Object> context = new HashMap<String, Object>();
// 如果拦截器不通过
for (WxMessageInterceptor interceptor : this.interceptors) {
if (!interceptor.intercept(wxMessage, context)) {
return;
return null;
}
}
// 交给handler处理
for (WxMessageHandler interceptor : this.handlers) {
interceptor.handle(wxMessage, context);
WxXmlMessage res = null;
for (WxMessageHandler handler : this.handlers) {
// 返回最后handler的结果
res = handler.handle(wxMessage, context);
}
return;
return res;
}
}