issue #77 添加自定义消息匹配器的支持

This commit is contained in:
Daniel Qian
2015-01-22 20:37:26 +08:00
parent b00bf13bd7
commit 36dad7b8d0
6 changed files with 90 additions and 7 deletions

View File

@@ -0,0 +1,17 @@
package me.chanjar.weixin.cp.api;
import me.chanjar.weixin.cp.bean.WxCpXmlMessage;
/**
* 消息匹配器,用在消息路由的时候
*/
public interface WxCpMessageMatcher {
/**
* 消息是否匹配某种模式
* @param message
* @return
*/
public boolean match(WxCpXmlMessage message);
}

View File

@@ -228,6 +228,8 @@ public class WxCpMessageRouter {
private String rContent;
private WxCpMessageMatcher matcher;
private boolean reEnter = false;
private Integer agentId;
@@ -320,6 +322,16 @@ public class WxCpMessageRouter {
return this;
}
/**
* 如果消息匹配某个matcher用在用户需要自定义更复杂的匹配规则的时候
* @param matcher
* @return
*/
public Rule matcher(WxCpMessageMatcher matcher) {
this.matcher = matcher;
return this;
}
/**
* 设置微信消息拦截器
* @param interceptor
@@ -403,6 +415,8 @@ public class WxCpMessageRouter {
(this.content == null || this.content.equals(wxMessage.getContent() == null ? null : wxMessage.getContent().trim()))
&&
(this.rContent == null || Pattern.matches(this.rContent, wxMessage.getContent() == null ? "" : wxMessage.getContent().trim()))
&&
(this.matcher == null || this.matcher.match(wxMessage))
;
}

View File

@@ -42,6 +42,12 @@ public class WxCpMessageRouterTest {
.rule().async(async).eventKey("KEY_1").handler(new WxEchoCpMessageHandler(sb, "KEY_1")).end()
.rule().async(async).content("CONTENT_1").handler(new WxEchoCpMessageHandler(sb, "CONTENT_1")).end()
.rule().async(async).rContent(".*bc.*").handler(new WxEchoCpMessageHandler(sb, "abcd")).end()
.rule().async(async).matcher(new WxCpMessageMatcher() {
@Override
public boolean match(WxCpXmlMessage message) {
return "strangeformat".equals(message.getFormat());
}
}).handler(new WxEchoCpMessageHandler(sb, "matcher")).end()
.rule().async(async).handler(new WxEchoCpMessageHandler(sb, "ALL")).end();
;
}
@@ -92,6 +98,7 @@ public class WxCpMessageRouterTest {
Thread.sleep(1000l * 2);
}
@DataProvider(name="messages-1")
public Object[][] messages2() {
WxCpXmlMessage message1 = new WxCpXmlMessage();
@@ -109,9 +116,12 @@ public class WxCpMessageRouterTest {
WxCpXmlMessage message5 = new WxCpXmlMessage();
message5.setContent("BLA");
WxCpXmlMessage message6 = new WxCpXmlMessage();
WxCpXmlMessage message6 = new WxCpXmlMessage();
message6.setContent("abcd");
WxCpXmlMessage message7 = new WxCpXmlMessage();
message7.setFormat("strangeformat");
WxCpXmlMessage c2 = new WxCpXmlMessage();
c2.setMsgType(WxConsts.XML_MSG_TEXT);
c2.setEvent(WxConsts.EVT_CLICK);
@@ -127,6 +137,7 @@ public class WxCpMessageRouterTest {
c4.setEventKey("KEY_1");
c4.setContent("CONTENT_1");
return new Object[][] {
new Object[] { message1, WxConsts.XML_MSG_TEXT + "," },
new Object[] { message2, WxConsts.EVT_CLICK + "," },
@@ -134,6 +145,7 @@ public class WxCpMessageRouterTest {
new Object[] { message4, "CONTENT_1," },
new Object[] { message5, "ALL," },
new Object[] { message6, "abcd," },
new Object[] { message7, "matcher," },
new Object[] { c2, "COMBINE_2," },
new Object[] { c3, "COMBINE_3," },
new Object[] { c4, "COMBINE_4," }
@@ -290,7 +302,6 @@ public class WxCpMessageRouterTest {
return null;
}
}
}

View File

@@ -0,0 +1,17 @@
package me.chanjar.weixin.mp.api;
import me.chanjar.weixin.mp.bean.WxMpXmlMessage;
/**
* 消息匹配器,用在消息路由的时候
*/
public interface WxMpMessageMatcher {
/**
* 消息是否匹配某种模式
* @param message
* @return
*/
public boolean match(WxMpXmlMessage message);
}

View File

@@ -226,6 +226,8 @@ public class WxMpMessageRouter {
private String rContent;
private WxMpMessageMatcher matcher;
private boolean reEnter = false;
private List<WxMpMessageHandler> handlers = new ArrayList<WxMpMessageHandler>();
@@ -306,6 +308,16 @@ public class WxMpMessageRouter {
return this;
}
/**
* 如果消息匹配某个matcher用在用户需要自定义更复杂的匹配规则的时候
* @param matcher
* @return
*/
public Rule matcher(WxMpMessageMatcher matcher) {
this.matcher = matcher;
return this;
}
/**
* 设置微信消息拦截器
* @param interceptor
@@ -387,6 +399,8 @@ public class WxMpMessageRouter {
(this.content == null || this.content.equals(wxMessage.getContent() == null ? null : wxMessage.getContent().trim()))
&&
(this.rContent == null || Pattern.matches(this.rContent, wxMessage.getContent() == null ? "" : wxMessage.getContent().trim()))
&&
(this.matcher == null || this.matcher.match(wxMessage))
;
}

View File

@@ -42,6 +42,12 @@ public class WxMpMessageRouterTest {
.rule().async(async).eventKey("KEY_1").handler(new WxEchoMpMessageHandler(sb, "KEY_1")).end()
.rule().async(async).content("CONTENT_1").handler(new WxEchoMpMessageHandler(sb, "CONTENT_1")).end()
.rule().async(async).rContent(".*bc.*").handler(new WxEchoMpMessageHandler(sb, "abcd")).end()
.rule().async(async).matcher(new WxMpMessageMatcher() {
@Override
public boolean match(WxMpXmlMessage message) {
return "strangeformat".equals(message.getFormat());
}
}).handler(new WxEchoMpMessageHandler(sb, "matcher")).end()
.rule().async(async).handler(new WxEchoMpMessageHandler(sb, "ALL")).end();
;
}
@@ -109,9 +115,12 @@ public class WxMpMessageRouterTest {
WxMpXmlMessage message5 = new WxMpXmlMessage();
message5.setContent("BLA");
WxMpXmlMessage message6 = new WxMpXmlMessage();
WxMpXmlMessage message6 = new WxMpXmlMessage();
message6.setContent("abcd");
WxMpXmlMessage message7 = new WxMpXmlMessage();
message7.setFormat("strangeformat");
WxMpXmlMessage c2 = new WxMpXmlMessage();
c2.setMsgType(WxConsts.XML_MSG_TEXT);
c2.setEvent(WxConsts.EVT_CLICK);
@@ -134,6 +143,7 @@ public class WxMpMessageRouterTest {
new Object[] { message4, "CONTENT_1," },
new Object[] { message5, "ALL," },
new Object[] { message6, "abcd," },
new Object[] { message7, "matcher," },
new Object[] { c2, "COMBINE_2," },
new Object[] { c3, "COMBINE_3," },
new Object[] { c4, "COMBINE_4," }