Procházet zdrojové kódy

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

master
Daniel Qian před 10 roky
rodič
revize
36dad7b8d0
6 změnil soubory, kde provedl 90 přidání a 7 odebrání
  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 Zobrazit soubor

@@ -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 Zobrazit soubor

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



+ 15
- 4
weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java Zobrazit soubor

@@ -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);
@@ -126,7 +136,8 @@ public class WxCpMessageRouterTest {
c4.setEvent(WxConsts.EVT_CLICK);
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;
}


}

}

+ 17
- 0
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMessageMatcher.java Zobrazit soubor

@@ -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 Zobrazit soubor

@@ -225,7 +225,9 @@ public class WxMpMessageRouter {
private String content;
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))
;
}


+ 12
- 2
weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java Zobrazit soubor

@@ -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," }


Načítá se…
Zrušit
Uložit