浏览代码

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

master
Daniel Qian 10 年前
父节点
当前提交
36dad7b8d0
共有 6 个文件被更改,包括 90 次插入7 次删除
  1. +17
    -0
      weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageMatcher.java
  2. +14
    -0
      weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java
  3. +15
    -4
      weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java
  4. +17
    -0
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageMatcher.java
  5. +15
    -1
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java
  6. +12
    -2
      weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java

+ 17
- 0
weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageMatcher.java 查看文件

@@ -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);

}

+ 14
- 0
weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpMessageRouter.java 查看文件

@@ -228,6 +228,8 @@ public class WxCpMessageRouter {


private String rContent; private String rContent;


private WxCpMessageMatcher matcher;

private boolean reEnter = false; private boolean reEnter = false;


private Integer agentId; private Integer agentId;
@@ -320,6 +322,16 @@ public class WxCpMessageRouter {
return this; return this;
} }


/**
* 如果消息匹配某个matcher,用在用户需要自定义更复杂的匹配规则的时候
* @param matcher
* @return
*/
public Rule matcher(WxCpMessageMatcher matcher) {
this.matcher = matcher;
return this;
}

/** /**
* 设置微信消息拦截器 * 设置微信消息拦截器
* @param interceptor * @param interceptor
@@ -403,6 +415,8 @@ public class WxCpMessageRouter {
(this.content == null || this.content.equals(wxMessage.getContent() == null ? null : wxMessage.getContent().trim())) (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.rContent == null || Pattern.matches(this.rContent, wxMessage.getContent() == null ? "" : wxMessage.getContent().trim()))
&&
(this.matcher == null || this.matcher.match(wxMessage))
; ;
} }




+ 15
- 4
weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java 查看文件

@@ -42,6 +42,12 @@ public class WxCpMessageRouterTest {
.rule().async(async).eventKey("KEY_1").handler(new WxEchoCpMessageHandler(sb, "KEY_1")).end() .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).content("CONTENT_1").handler(new WxEchoCpMessageHandler(sb, "CONTENT_1")).end()
.rule().async(async).rContent(".*bc.*").handler(new WxEchoCpMessageHandler(sb, "abcd")).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(); .rule().async(async).handler(new WxEchoCpMessageHandler(sb, "ALL")).end();
; ;
} }
@@ -92,6 +98,7 @@ public class WxCpMessageRouterTest {
Thread.sleep(1000l * 2); Thread.sleep(1000l * 2);
} }

@DataProvider(name="messages-1") @DataProvider(name="messages-1")
public Object[][] messages2() { public Object[][] messages2() {
WxCpXmlMessage message1 = new WxCpXmlMessage(); WxCpXmlMessage message1 = new WxCpXmlMessage();
@@ -109,9 +116,12 @@ public class WxCpMessageRouterTest {
WxCpXmlMessage message5 = new WxCpXmlMessage(); WxCpXmlMessage message5 = new WxCpXmlMessage();
message5.setContent("BLA"); message5.setContent("BLA");
WxCpXmlMessage message6 = new WxCpXmlMessage();
WxCpXmlMessage message6 = new WxCpXmlMessage();
message6.setContent("abcd"); message6.setContent("abcd");

WxCpXmlMessage message7 = new WxCpXmlMessage();
message7.setFormat("strangeformat");

WxCpXmlMessage c2 = new WxCpXmlMessage(); WxCpXmlMessage c2 = new WxCpXmlMessage();
c2.setMsgType(WxConsts.XML_MSG_TEXT); c2.setMsgType(WxConsts.XML_MSG_TEXT);
c2.setEvent(WxConsts.EVT_CLICK); c2.setEvent(WxConsts.EVT_CLICK);
@@ -126,7 +136,8 @@ public class WxCpMessageRouterTest {
c4.setEvent(WxConsts.EVT_CLICK); c4.setEvent(WxConsts.EVT_CLICK);
c4.setEventKey("KEY_1"); c4.setEventKey("KEY_1");
c4.setContent("CONTENT_1"); c4.setContent("CONTENT_1");


return new Object[][] { return new Object[][] {
new Object[] { message1, WxConsts.XML_MSG_TEXT + "," }, new Object[] { message1, WxConsts.XML_MSG_TEXT + "," },
new Object[] { message2, WxConsts.EVT_CLICK + "," }, new Object[] { message2, WxConsts.EVT_CLICK + "," },
@@ -134,6 +145,7 @@ public class WxCpMessageRouterTest {
new Object[] { message4, "CONTENT_1," }, new Object[] { message4, "CONTENT_1," },
new Object[] { message5, "ALL," }, new Object[] { message5, "ALL," },
new Object[] { message6, "abcd," }, new Object[] { message6, "abcd," },
new Object[] { message7, "matcher," },
new Object[] { c2, "COMBINE_2," }, new Object[] { c2, "COMBINE_2," },
new Object[] { c3, "COMBINE_3," }, new Object[] { c3, "COMBINE_3," },
new Object[] { c4, "COMBINE_4," } new Object[] { c4, "COMBINE_4," }
@@ -290,7 +302,6 @@ public class WxCpMessageRouterTest {
return null; return null;
} }



} }


} }

+ 17
- 0
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageMatcher.java 查看文件

@@ -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);

}

+ 15
- 1
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageRouter.java 查看文件

@@ -225,7 +225,9 @@ public class WxMpMessageRouter {
private String content; private String content;
private String rContent; private String rContent;

private WxMpMessageMatcher matcher;

private boolean reEnter = false; private boolean reEnter = false;
private List<WxMpMessageHandler> handlers = new ArrayList<WxMpMessageHandler>(); private List<WxMpMessageHandler> handlers = new ArrayList<WxMpMessageHandler>();
@@ -306,6 +308,16 @@ public class WxMpMessageRouter {
return this; return this;
} }


/**
* 如果消息匹配某个matcher,用在用户需要自定义更复杂的匹配规则的时候
* @param matcher
* @return
*/
public Rule matcher(WxMpMessageMatcher matcher) {
this.matcher = matcher;
return this;
}

/** /**
* 设置微信消息拦截器 * 设置微信消息拦截器
* @param interceptor * @param interceptor
@@ -387,6 +399,8 @@ public class WxMpMessageRouter {
(this.content == null || this.content.equals(wxMessage.getContent() == null ? null : wxMessage.getContent().trim())) (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.rContent == null || Pattern.matches(this.rContent, wxMessage.getContent() == null ? "" : wxMessage.getContent().trim()))
&&
(this.matcher == null || this.matcher.match(wxMessage))
; ;
} }


+ 12
- 2
weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java 查看文件

@@ -42,6 +42,12 @@ public class WxMpMessageRouterTest {
.rule().async(async).eventKey("KEY_1").handler(new WxEchoMpMessageHandler(sb, "KEY_1")).end() .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).content("CONTENT_1").handler(new WxEchoMpMessageHandler(sb, "CONTENT_1")).end()
.rule().async(async).rContent(".*bc.*").handler(new WxEchoMpMessageHandler(sb, "abcd")).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(); .rule().async(async).handler(new WxEchoMpMessageHandler(sb, "ALL")).end();
; ;
} }
@@ -109,9 +115,12 @@ public class WxMpMessageRouterTest {
WxMpXmlMessage message5 = new WxMpXmlMessage(); WxMpXmlMessage message5 = new WxMpXmlMessage();
message5.setContent("BLA"); message5.setContent("BLA");
WxMpXmlMessage message6 = new WxMpXmlMessage();
WxMpXmlMessage message6 = new WxMpXmlMessage();
message6.setContent("abcd"); message6.setContent("abcd");

WxMpXmlMessage message7 = new WxMpXmlMessage();
message7.setFormat("strangeformat");

WxMpXmlMessage c2 = new WxMpXmlMessage(); WxMpXmlMessage c2 = new WxMpXmlMessage();
c2.setMsgType(WxConsts.XML_MSG_TEXT); c2.setMsgType(WxConsts.XML_MSG_TEXT);
c2.setEvent(WxConsts.EVT_CLICK); c2.setEvent(WxConsts.EVT_CLICK);
@@ -134,6 +143,7 @@ public class WxMpMessageRouterTest {
new Object[] { message4, "CONTENT_1," }, new Object[] { message4, "CONTENT_1," },
new Object[] { message5, "ALL," }, new Object[] { message5, "ALL," },
new Object[] { message6, "abcd," }, new Object[] { message6, "abcd," },
new Object[] { message7, "matcher," },
new Object[] { c2, "COMBINE_2," }, new Object[] { c2, "COMBINE_2," },
new Object[] { c3, "COMBINE_3," }, new Object[] { c3, "COMBINE_3," },
new Object[] { c4, "COMBINE_4," } new Object[] { c4, "COMBINE_4," }


正在加载...
取消
保存