weixin4j-server:优化WeixinMessageMatcher
This commit is contained in:
parent
67d87a0a69
commit
8557633b23
@ -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里这么做
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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)) {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -110,6 +110,6 @@ public class WeixinRequestHandler extends
|
||||
.set(messageHandler.getToUserName());
|
||||
}
|
||||
messageDispatcher.doDispatch(ctx, request,
|
||||
messageHandler.getUniqueKey());
|
||||
messageHandler.getMessageKey());
|
||||
}
|
||||
}
|
||||
|
||||
@ -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() {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user