weixin4j-server:优化WeixinMessageMatcher

This commit is contained in:
jinyu 2015-05-16 21:47:43 +08:00
parent 67d87a0a69
commit 8557633b23
7 changed files with 84 additions and 90 deletions

View File

@ -46,7 +46,7 @@ weixin4j
<dependency>
<groupId>com.foxinmy</groupId>
<artifactId>weixin4j-server</artifactId>
<version>0.0.1</version>
<version>1.0.0</version>
</dependency>
以上依赖如果出现Missing artifact错误 请尝试在eclipse里这么做

View File

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.foxinmy</groupId>
<artifactId>weixin4j-server</artifactId>
<version>0.0.1</version>
<version>1.0.0</version>
<name>weixin4j-server</name>
<url>https://github.com/foxinmy/weixin4j/tree/master/weixin4j-server</url>
<description>微信消息netty服务器</description>

View File

@ -89,15 +89,15 @@ public class WeixinMessageDispatcher {
}
public void doDispatch(final ChannelHandlerContext context,
final WeixinRequest request, final String uniqueKey)
final WeixinRequest request, final String messageKey)
throws WeixinException {
Class<?> targetClass = messageMatcher.find(uniqueKey);
Class<?> targetClass = messageMatcher.find(messageKey);
Object message = request.getOriginalContent();
if (targetClass != null) {
message = messageRead(request.getOriginalContent(), targetClass);
}
MessageHandlerExecutor handlerExecutor = getHandlerExecutor(context,
request, uniqueKey, message);
request, messageKey, message);
if (handlerExecutor == null
|| handlerExecutor.getMessageHandler() == null) {
noHandlerFound(context, request, message);
@ -130,7 +130,7 @@ public class WeixinMessageDispatcher {
protected MessageHandlerExecutor getHandlerExecutor(
ChannelHandlerContext context, WeixinRequest request,
String uniqueKey, Object message) throws WeixinException {
String messageKey, Object message) throws WeixinException {
WeixinMessageHandler messageHandler = null;
WeixinMessageHandler[] messageHandlers = getMessageHandlers();
if (messageHandlers == null) {
@ -142,7 +142,7 @@ public class WeixinMessageDispatcher {
if (!messageMatcher.match(genericType)) {
message = messageRead(request.getOriginalContent(),
genericType);
messageMatcher.regist(uniqueKey, genericType);
messageMatcher.regist(messageKey, genericType);
}
if (genericType == message.getClass()
&& handler.canHandle(request, message)) {

View File

@ -27,8 +27,13 @@ public class WeixinMessageMatcher {
private final Logger log = LoggerFactory.getLogger(getClass());
private final String MP_TAG = "mp";
private final String QY_TAG = "qy";
public static final String MESSAGEKEY_MP_TAG = "mp";
public static final String MESSAGEKEY_SEPARATOR = ":";
public static final String MESSAGEKEY_MP_SEPARATOR = MESSAGEKEY_MP_TAG
+ MESSAGEKEY_SEPARATOR;
public static final String MESSAGEKEY_QY_TAG = "qy";
public static final String MESSAGEKEY_QY_SEPARATOR = MESSAGEKEY_QY_TAG
+ MESSAGEKEY_SEPARATOR;
private final Map<String, Class<?>> key2ClassMap;
private final Map<Class<?>, String> class2KeyMap;
@ -47,123 +52,107 @@ public class WeixinMessageMatcher {
// /////////////////////////////////////////////////
/******************** 普通消息 ********************/
// /////////////////////////////////////////////////
String uniqueKey = MessageType.text.name();
String messageKey = MessageType.text.name();
Class<?> clazz = TextMessage.class;
regist(uniqueKey, clazz);
uniqueKey = MessageType.image.name();
regist(messageKey, clazz);
messageKey = MessageType.image.name();
clazz = ImageMessage.class;
regist(uniqueKey, clazz);
uniqueKey = MessageType.voice.name();
regist(messageKey, clazz);
messageKey = MessageType.voice.name();
clazz = VoiceMessage.class;
regist(uniqueKey, clazz);
uniqueKey = MessageType.video.name();
regist(messageKey, clazz);
messageKey = MessageType.video.name();
clazz = VideoMessage.class;
regist(uniqueKey, clazz);
uniqueKey = MessageType.shortvideo.name();
regist(uniqueKey, clazz);
uniqueKey = MessageType.location.name();
regist(messageKey, clazz);
messageKey = MessageType.shortvideo.name();
regist(messageKey, clazz);
messageKey = MessageType.location.name();
clazz = LocationMessage.class;
regist(uniqueKey, clazz);
regist(messageKey, clazz);
}
private void init1() {
// /////////////////////////////////////////////////
/******************** 事件消息 ********************/
// /////////////////////////////////////////////////
String uniqueKey;
Class<?> clazz;
for (EventType eventType : new EventType[] { EventType.subscribe,
EventType.unsubscribe }) {
uniqueKey = String.format("%s:%s", MessageType.event.name(),
eventType.name());
clazz = com.foxinmy.weixin4j.mp.event.ScribeEventMessage.class;
regist(String.format("%s:%s", MP_TAG, uniqueKey), clazz);
regist(mpEventMessagKey(eventType),
com.foxinmy.weixin4j.mp.event.ScribeEventMessage.class);
}
for (EventType eventType : new EventType[] { EventType.subscribe,
EventType.unsubscribe }) {
uniqueKey = String.format("%s:%s", MessageType.event.name(),
eventType.name());
clazz = com.foxinmy.weixin4j.qy.event.ScribeEventMessage.class;
regist(String.format("%s:%s", QY_TAG, uniqueKey), clazz);
regist(qyEventMessagKey(eventType),
com.foxinmy.weixin4j.qy.event.ScribeEventMessage.class);
}
uniqueKey = String.format("%s:%s", MessageType.event.name(),
EventType.location.name());
clazz = LocationEventMessage.class;
regist(uniqueKey, clazz);
Class<?> clazz = LocationEventMessage.class;
regist(mpEventMessagKey(EventType.location), clazz);
regist(qyEventMessagKey(EventType.location), clazz);
for (EventType eventType : new EventType[] { EventType.click,
EventType.view }) {
uniqueKey = String.format("%s:%s", MessageType.event.name(),
eventType.name());
clazz = com.foxinmy.weixin4j.message.event.MenuEventMessage.class;
regist(uniqueKey, clazz);
regist(mpEventMessagKey(eventType), clazz);
regist(qyEventMessagKey(eventType), clazz);
}
for (EventType eventType : new EventType[] { EventType.scancode_push,
EventType.scancode_waitmsg }) {
uniqueKey = String.format("%s:%s", MessageType.event.name(),
eventType.name());
clazz = com.foxinmy.weixin4j.message.event.MenuScanEventMessage.class;
regist(uniqueKey, clazz);
regist(mpEventMessagKey(eventType), clazz);
regist(qyEventMessagKey(eventType), clazz);
}
for (EventType eventType : new EventType[] { EventType.pic_sysphoto,
EventType.pic_photo_or_album, EventType.pic_weixin }) {
uniqueKey = String.format("%s:%s", MessageType.event.name(),
eventType.name());
clazz = com.foxinmy.weixin4j.message.event.MenuPhotoEventMessage.class;
regist(uniqueKey, clazz);
regist(mpEventMessagKey(eventType), clazz);
regist(qyEventMessagKey(eventType), clazz);
}
uniqueKey = String.format("%s:%s", MessageType.event.name(),
EventType.location_select.name());
clazz = com.foxinmy.weixin4j.message.event.MenuLocationEventMessage.class;
regist(uniqueKey, clazz);
regist(mpEventMessagKey(EventType.location_select), clazz);
regist(qyEventMessagKey(EventType.location_select), clazz);
}
private void init2() {
// /////////////////////////////////////////////////
/******************** 公众平台事件消息 ********************/
// /////////////////////////////////////////////////
String uniqueKey = String.format("%s:%s:%s", MP_TAG,
MessageType.event.name(), EventType.scan.name());
Class<?> clazz = ScanEventMessage.class;
regist(uniqueKey, clazz);
uniqueKey = String.format("%s:%s:%s", MP_TAG, MessageType.event.name(),
EventType.masssendjobfinish.name());
clazz = MassEventMessage.class;
regist(uniqueKey, clazz);
uniqueKey = String.format("%s:%s:%s", MP_TAG, MessageType.event.name(),
EventType.templatesendjobfinish.name());
clazz = TemplatesendjobfinishMessage.class;
regist(uniqueKey, clazz);
uniqueKey = String.format("%s:%s:%s", MP_TAG, MessageType.event.name(),
EventType.kf_create_session.name());
clazz = KfCreateEventMessage.class;
regist(uniqueKey, clazz);
uniqueKey = String.format("%s:%s:%s", MP_TAG, MessageType.event.name(),
EventType.kf_close_session.name());
clazz = KfCloseEventMessage.class;
regist(uniqueKey, clazz);
uniqueKey = String.format("%s:%s:%s", MP_TAG, MessageType.event.name(),
EventType.kf_switch_session.name());
clazz = KfSwitchEventMessage.class;
regist(uniqueKey, clazz);
regist(mpEventMessagKey(EventType.scan), ScanEventMessage.class);
regist(mpEventMessagKey(EventType.masssendjobfinish),
MassEventMessage.class);
regist(mpEventMessagKey(EventType.templatesendjobfinish),
TemplatesendjobfinishMessage.class);
regist(mpEventMessagKey(EventType.kf_create_session),
KfCreateEventMessage.class);
regist(mpEventMessagKey(EventType.kf_close_session),
KfCloseEventMessage.class);
regist(mpEventMessagKey(EventType.kf_switch_session),
KfSwitchEventMessage.class);
}
private void init3() {
// /////////////////////////////////////////////////
/******************** 企业号事件消息 ********************/
// /////////////////////////////////////////////////
String uniqueKey = String.format("%s:%s:%s", QY_TAG,
MessageType.event.name(), EventType.batch_job_result.name());
Class<?> clazz = BatchjobresultMessage.class;
regist(uniqueKey, clazz);
uniqueKey = String.format("%s:%s:%s", QY_TAG, MessageType.event.name(),
EventType.enter_agent.name());
clazz = EnterAgentEventMessage.class;
regist(uniqueKey, clazz);
regist(qyEventMessagKey(EventType.batch_job_result),
BatchjobresultMessage.class);
regist(qyEventMessagKey(EventType.enter_agent),
EnterAgentEventMessage.class);
}
public void regist(String uniqueKey, Class<?> clazz) {
key2ClassMap.put(uniqueKey, clazz);
class2KeyMap.put(clazz, uniqueKey);
private String mpEventMessagKey(EventType eventType) {
return String.format("%s%s%s%s", MESSAGEKEY_MP_SEPARATOR,
MessageType.event.name(), MESSAGEKEY_SEPARATOR,
eventType.name());
}
private String qyEventMessagKey(EventType eventType) {
return String.format("%s%s%s%s", MESSAGEKEY_QY_SEPARATOR,
MessageType.event.name(), MESSAGEKEY_SEPARATOR,
eventType.name());
}
public void regist(String messageKey, Class<?> clazz) {
key2ClassMap.put(messageKey, clazz);
class2KeyMap.put(clazz, messageKey);
}
public boolean match(Object keyOrClass) {
@ -171,7 +160,7 @@ public class WeixinMessageMatcher {
|| class2KeyMap.containsKey(keyOrClass);
}
public Class<?> find(String uniqueKey) {
return key2ClassMap.get(uniqueKey);
public Class<?> find(String messageKey) {
return key2ClassMap.get(messageKey);
}
}

View File

@ -16,6 +16,7 @@ public class DebugMessageHandler implements WeixinMessageHandler {
@Override
public boolean canHandle(WeixinRequest request, Object message)
throws WeixinException {
System.err.println(message.getClass());
return true;
}

View File

@ -110,6 +110,6 @@ public class WeixinRequestHandler extends
.set(messageHandler.getToUserName());
}
messageDispatcher.doDispatch(ctx, request,
messageHandler.getUniqueKey());
messageHandler.getMessageKey());
}
}

View File

@ -9,6 +9,7 @@ import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
import com.foxinmy.weixin4j.dispatcher.WeixinMessageMatcher;
import com.foxinmy.weixin4j.type.MessageType;
import com.foxinmy.weixin4j.util.Consts;
import com.foxinmy.weixin4j.util.StringUtil;
@ -54,18 +55,21 @@ public class CruxMessageHandler extends DefaultHandler {
this.content = new String(ch, start, length);
}
public String getUniqueKey() {
public String getMessageKey() {
StringBuilder uniqueKey = new StringBuilder();
uniqueKey.append(msgType);
if (msgType.equals(MessageType.event.name())) {
if (StringUtil.isBlank(agentId)) {
uniqueKey.insert(0, "mp:");
uniqueKey.insert(0,
WeixinMessageMatcher.MESSAGEKEY_MP_SEPARATOR);
} else {
uniqueKey.insert(0, "qy:");
uniqueKey.insert(0,
WeixinMessageMatcher.MESSAGEKEY_QY_SEPARATOR);
}
uniqueKey.append(":").append(eventType);
uniqueKey.append(WeixinMessageMatcher.MESSAGEKEY_SEPARATOR).append(
eventType);
}
return uniqueKey.toString();
return uniqueKey.toString().toLowerCase();
}
public String getFromUserName() {