weixin4j-server:优化WeixinMessageMatcher
This commit is contained in:
parent
67d87a0a69
commit
8557633b23
@ -46,7 +46,7 @@ weixin4j
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.foxinmy</groupId>
|
<groupId>com.foxinmy</groupId>
|
||||||
<artifactId>weixin4j-server</artifactId>
|
<artifactId>weixin4j-server</artifactId>
|
||||||
<version>0.0.1</version>
|
<version>1.0.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
以上依赖如果出现Missing artifact错误 请尝试在eclipse里这么做
|
以上依赖如果出现Missing artifact错误 请尝试在eclipse里这么做
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>com.foxinmy</groupId>
|
<groupId>com.foxinmy</groupId>
|
||||||
<artifactId>weixin4j-server</artifactId>
|
<artifactId>weixin4j-server</artifactId>
|
||||||
<version>0.0.1</version>
|
<version>1.0.0</version>
|
||||||
<name>weixin4j-server</name>
|
<name>weixin4j-server</name>
|
||||||
<url>https://github.com/foxinmy/weixin4j/tree/master/weixin4j-server</url>
|
<url>https://github.com/foxinmy/weixin4j/tree/master/weixin4j-server</url>
|
||||||
<description>微信消息netty服务器</description>
|
<description>微信消息netty服务器</description>
|
||||||
|
|||||||
@ -89,15 +89,15 @@ public class WeixinMessageDispatcher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void doDispatch(final ChannelHandlerContext context,
|
public void doDispatch(final ChannelHandlerContext context,
|
||||||
final WeixinRequest request, final String uniqueKey)
|
final WeixinRequest request, final String messageKey)
|
||||||
throws WeixinException {
|
throws WeixinException {
|
||||||
Class<?> targetClass = messageMatcher.find(uniqueKey);
|
Class<?> targetClass = messageMatcher.find(messageKey);
|
||||||
Object message = request.getOriginalContent();
|
Object message = request.getOriginalContent();
|
||||||
if (targetClass != null) {
|
if (targetClass != null) {
|
||||||
message = messageRead(request.getOriginalContent(), targetClass);
|
message = messageRead(request.getOriginalContent(), targetClass);
|
||||||
}
|
}
|
||||||
MessageHandlerExecutor handlerExecutor = getHandlerExecutor(context,
|
MessageHandlerExecutor handlerExecutor = getHandlerExecutor(context,
|
||||||
request, uniqueKey, message);
|
request, messageKey, message);
|
||||||
if (handlerExecutor == null
|
if (handlerExecutor == null
|
||||||
|| handlerExecutor.getMessageHandler() == null) {
|
|| handlerExecutor.getMessageHandler() == null) {
|
||||||
noHandlerFound(context, request, message);
|
noHandlerFound(context, request, message);
|
||||||
@ -130,7 +130,7 @@ public class WeixinMessageDispatcher {
|
|||||||
|
|
||||||
protected MessageHandlerExecutor getHandlerExecutor(
|
protected MessageHandlerExecutor getHandlerExecutor(
|
||||||
ChannelHandlerContext context, WeixinRequest request,
|
ChannelHandlerContext context, WeixinRequest request,
|
||||||
String uniqueKey, Object message) throws WeixinException {
|
String messageKey, Object message) throws WeixinException {
|
||||||
WeixinMessageHandler messageHandler = null;
|
WeixinMessageHandler messageHandler = null;
|
||||||
WeixinMessageHandler[] messageHandlers = getMessageHandlers();
|
WeixinMessageHandler[] messageHandlers = getMessageHandlers();
|
||||||
if (messageHandlers == null) {
|
if (messageHandlers == null) {
|
||||||
@ -142,7 +142,7 @@ public class WeixinMessageDispatcher {
|
|||||||
if (!messageMatcher.match(genericType)) {
|
if (!messageMatcher.match(genericType)) {
|
||||||
message = messageRead(request.getOriginalContent(),
|
message = messageRead(request.getOriginalContent(),
|
||||||
genericType);
|
genericType);
|
||||||
messageMatcher.regist(uniqueKey, genericType);
|
messageMatcher.regist(messageKey, genericType);
|
||||||
}
|
}
|
||||||
if (genericType == message.getClass()
|
if (genericType == message.getClass()
|
||||||
&& handler.canHandle(request, message)) {
|
&& handler.canHandle(request, message)) {
|
||||||
|
|||||||
@ -27,8 +27,13 @@ public class WeixinMessageMatcher {
|
|||||||
|
|
||||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
private final String MP_TAG = "mp";
|
public static final String MESSAGEKEY_MP_TAG = "mp";
|
||||||
private final String QY_TAG = "qy";
|
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<String, Class<?>> key2ClassMap;
|
||||||
private final Map<Class<?>, String> class2KeyMap;
|
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;
|
Class<?> clazz = TextMessage.class;
|
||||||
regist(uniqueKey, clazz);
|
regist(messageKey, clazz);
|
||||||
uniqueKey = MessageType.image.name();
|
messageKey = MessageType.image.name();
|
||||||
clazz = ImageMessage.class;
|
clazz = ImageMessage.class;
|
||||||
regist(uniqueKey, clazz);
|
regist(messageKey, clazz);
|
||||||
uniqueKey = MessageType.voice.name();
|
messageKey = MessageType.voice.name();
|
||||||
clazz = VoiceMessage.class;
|
clazz = VoiceMessage.class;
|
||||||
regist(uniqueKey, clazz);
|
regist(messageKey, clazz);
|
||||||
uniqueKey = MessageType.video.name();
|
messageKey = MessageType.video.name();
|
||||||
clazz = VideoMessage.class;
|
clazz = VideoMessage.class;
|
||||||
regist(uniqueKey, clazz);
|
regist(messageKey, clazz);
|
||||||
uniqueKey = MessageType.shortvideo.name();
|
messageKey = MessageType.shortvideo.name();
|
||||||
regist(uniqueKey, clazz);
|
regist(messageKey, clazz);
|
||||||
uniqueKey = MessageType.location.name();
|
messageKey = MessageType.location.name();
|
||||||
clazz = LocationMessage.class;
|
clazz = LocationMessage.class;
|
||||||
regist(uniqueKey, clazz);
|
regist(messageKey, clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void init1() {
|
private void init1() {
|
||||||
// /////////////////////////////////////////////////
|
// /////////////////////////////////////////////////
|
||||||
/******************** 事件消息 ********************/
|
/******************** 事件消息 ********************/
|
||||||
// /////////////////////////////////////////////////
|
// /////////////////////////////////////////////////
|
||||||
String uniqueKey;
|
|
||||||
Class<?> clazz;
|
|
||||||
for (EventType eventType : new EventType[] { EventType.subscribe,
|
for (EventType eventType : new EventType[] { EventType.subscribe,
|
||||||
EventType.unsubscribe }) {
|
EventType.unsubscribe }) {
|
||||||
uniqueKey = String.format("%s:%s", MessageType.event.name(),
|
regist(mpEventMessagKey(eventType),
|
||||||
eventType.name());
|
com.foxinmy.weixin4j.mp.event.ScribeEventMessage.class);
|
||||||
clazz = com.foxinmy.weixin4j.mp.event.ScribeEventMessage.class;
|
|
||||||
regist(String.format("%s:%s", MP_TAG, uniqueKey), clazz);
|
|
||||||
}
|
}
|
||||||
for (EventType eventType : new EventType[] { EventType.subscribe,
|
for (EventType eventType : new EventType[] { EventType.subscribe,
|
||||||
EventType.unsubscribe }) {
|
EventType.unsubscribe }) {
|
||||||
uniqueKey = String.format("%s:%s", MessageType.event.name(),
|
regist(qyEventMessagKey(eventType),
|
||||||
eventType.name());
|
com.foxinmy.weixin4j.qy.event.ScribeEventMessage.class);
|
||||||
clazz = com.foxinmy.weixin4j.qy.event.ScribeEventMessage.class;
|
|
||||||
regist(String.format("%s:%s", QY_TAG, uniqueKey), clazz);
|
|
||||||
}
|
}
|
||||||
uniqueKey = String.format("%s:%s", MessageType.event.name(),
|
Class<?> clazz = LocationEventMessage.class;
|
||||||
EventType.location.name());
|
regist(mpEventMessagKey(EventType.location), clazz);
|
||||||
clazz = LocationEventMessage.class;
|
regist(qyEventMessagKey(EventType.location), clazz);
|
||||||
regist(uniqueKey, clazz);
|
|
||||||
for (EventType eventType : new EventType[] { EventType.click,
|
for (EventType eventType : new EventType[] { EventType.click,
|
||||||
EventType.view }) {
|
EventType.view }) {
|
||||||
uniqueKey = String.format("%s:%s", MessageType.event.name(),
|
|
||||||
eventType.name());
|
|
||||||
clazz = com.foxinmy.weixin4j.message.event.MenuEventMessage.class;
|
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,
|
for (EventType eventType : new EventType[] { EventType.scancode_push,
|
||||||
EventType.scancode_waitmsg }) {
|
EventType.scancode_waitmsg }) {
|
||||||
uniqueKey = String.format("%s:%s", MessageType.event.name(),
|
|
||||||
eventType.name());
|
|
||||||
clazz = com.foxinmy.weixin4j.message.event.MenuScanEventMessage.class;
|
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,
|
for (EventType eventType : new EventType[] { EventType.pic_sysphoto,
|
||||||
EventType.pic_photo_or_album, EventType.pic_weixin }) {
|
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;
|
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;
|
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() {
|
private void init2() {
|
||||||
// /////////////////////////////////////////////////
|
// /////////////////////////////////////////////////
|
||||||
/******************** 公众平台事件消息 ********************/
|
/******************** 公众平台事件消息 ********************/
|
||||||
// /////////////////////////////////////////////////
|
// /////////////////////////////////////////////////
|
||||||
String uniqueKey = String.format("%s:%s:%s", MP_TAG,
|
regist(mpEventMessagKey(EventType.scan), ScanEventMessage.class);
|
||||||
MessageType.event.name(), EventType.scan.name());
|
regist(mpEventMessagKey(EventType.masssendjobfinish),
|
||||||
Class<?> clazz = ScanEventMessage.class;
|
MassEventMessage.class);
|
||||||
regist(uniqueKey, clazz);
|
regist(mpEventMessagKey(EventType.templatesendjobfinish),
|
||||||
uniqueKey = String.format("%s:%s:%s", MP_TAG, MessageType.event.name(),
|
TemplatesendjobfinishMessage.class);
|
||||||
EventType.masssendjobfinish.name());
|
regist(mpEventMessagKey(EventType.kf_create_session),
|
||||||
clazz = MassEventMessage.class;
|
KfCreateEventMessage.class);
|
||||||
regist(uniqueKey, clazz);
|
regist(mpEventMessagKey(EventType.kf_close_session),
|
||||||
uniqueKey = String.format("%s:%s:%s", MP_TAG, MessageType.event.name(),
|
KfCloseEventMessage.class);
|
||||||
EventType.templatesendjobfinish.name());
|
regist(mpEventMessagKey(EventType.kf_switch_session),
|
||||||
clazz = TemplatesendjobfinishMessage.class;
|
KfSwitchEventMessage.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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void init3() {
|
private void init3() {
|
||||||
// /////////////////////////////////////////////////
|
// /////////////////////////////////////////////////
|
||||||
/******************** 企业号事件消息 ********************/
|
/******************** 企业号事件消息 ********************/
|
||||||
// /////////////////////////////////////////////////
|
// /////////////////////////////////////////////////
|
||||||
String uniqueKey = String.format("%s:%s:%s", QY_TAG,
|
regist(qyEventMessagKey(EventType.batch_job_result),
|
||||||
MessageType.event.name(), EventType.batch_job_result.name());
|
BatchjobresultMessage.class);
|
||||||
Class<?> clazz = BatchjobresultMessage.class;
|
regist(qyEventMessagKey(EventType.enter_agent),
|
||||||
regist(uniqueKey, clazz);
|
EnterAgentEventMessage.class);
|
||||||
uniqueKey = String.format("%s:%s:%s", QY_TAG, MessageType.event.name(),
|
|
||||||
EventType.enter_agent.name());
|
|
||||||
clazz = EnterAgentEventMessage.class;
|
|
||||||
regist(uniqueKey, clazz);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void regist(String uniqueKey, Class<?> clazz) {
|
private String mpEventMessagKey(EventType eventType) {
|
||||||
key2ClassMap.put(uniqueKey, clazz);
|
return String.format("%s%s%s%s", MESSAGEKEY_MP_SEPARATOR,
|
||||||
class2KeyMap.put(clazz, uniqueKey);
|
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) {
|
public boolean match(Object keyOrClass) {
|
||||||
@ -171,7 +160,7 @@ public class WeixinMessageMatcher {
|
|||||||
|| class2KeyMap.containsKey(keyOrClass);
|
|| class2KeyMap.containsKey(keyOrClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Class<?> find(String uniqueKey) {
|
public Class<?> find(String messageKey) {
|
||||||
return key2ClassMap.get(uniqueKey);
|
return key2ClassMap.get(messageKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,6 +16,7 @@ public class DebugMessageHandler implements WeixinMessageHandler {
|
|||||||
@Override
|
@Override
|
||||||
public boolean canHandle(WeixinRequest request, Object message)
|
public boolean canHandle(WeixinRequest request, Object message)
|
||||||
throws WeixinException {
|
throws WeixinException {
|
||||||
|
System.err.println(message.getClass());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -110,6 +110,6 @@ public class WeixinRequestHandler extends
|
|||||||
.set(messageHandler.getToUserName());
|
.set(messageHandler.getToUserName());
|
||||||
}
|
}
|
||||||
messageDispatcher.doDispatch(ctx, request,
|
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.DefaultHandler;
|
||||||
import org.xml.sax.helpers.XMLReaderFactory;
|
import org.xml.sax.helpers.XMLReaderFactory;
|
||||||
|
|
||||||
|
import com.foxinmy.weixin4j.dispatcher.WeixinMessageMatcher;
|
||||||
import com.foxinmy.weixin4j.type.MessageType;
|
import com.foxinmy.weixin4j.type.MessageType;
|
||||||
import com.foxinmy.weixin4j.util.Consts;
|
import com.foxinmy.weixin4j.util.Consts;
|
||||||
import com.foxinmy.weixin4j.util.StringUtil;
|
import com.foxinmy.weixin4j.util.StringUtil;
|
||||||
@ -54,18 +55,21 @@ public class CruxMessageHandler extends DefaultHandler {
|
|||||||
this.content = new String(ch, start, length);
|
this.content = new String(ch, start, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getUniqueKey() {
|
public String getMessageKey() {
|
||||||
StringBuilder uniqueKey = new StringBuilder();
|
StringBuilder uniqueKey = new StringBuilder();
|
||||||
uniqueKey.append(msgType);
|
uniqueKey.append(msgType);
|
||||||
if (msgType.equals(MessageType.event.name())) {
|
if (msgType.equals(MessageType.event.name())) {
|
||||||
if (StringUtil.isBlank(agentId)) {
|
if (StringUtil.isBlank(agentId)) {
|
||||||
uniqueKey.insert(0, "mp:");
|
uniqueKey.insert(0,
|
||||||
|
WeixinMessageMatcher.MESSAGEKEY_MP_SEPARATOR);
|
||||||
} else {
|
} 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() {
|
public String getFromUserName() {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user