新增MultipleMessageHandlerAdapter多个消息适配类

This commit is contained in:
jinyu 2016-03-12 18:05:36 +08:00
parent 64c95c2903
commit 5a9d5b61d3
11 changed files with 107 additions and 47 deletions

View File

@ -134,4 +134,11 @@
* 2015-02-04
+ version upgrade to 1.1.6
+ version upgrade to 1.1.6
* 2015-03-12
+ 修改ClassUtil获取class不到的bug
+ 新增MultipleMessageHandlerAdapter多个消息适配类

View File

@ -1,5 +1,7 @@
package com.foxinmy.weixin4j.dispatcher;
import java.util.Map;
import com.foxinmy.weixin4j.exception.WeixinException;
/**
@ -17,4 +19,6 @@ public interface BeanFactory {
<T> T getBean(Class<T> clazz) throws WeixinException;
<T> T getBean(String name, Class<T> clazz) throws WeixinException;
<T> Map<String, T> getBeans(Class<T> clazz) throws WeixinException;
}

View File

@ -7,6 +7,7 @@ import io.netty.util.internal.logging.InternalLoggerFactory;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.handler.WeixinMessageHandler;
import com.foxinmy.weixin4j.interceptor.WeixinMessageInterceptor;
import com.foxinmy.weixin4j.request.WeixinMessage;
import com.foxinmy.weixin4j.request.WeixinRequest;
import com.foxinmy.weixin4j.response.WeixinResponse;
@ -62,7 +63,7 @@ public class MessageHandlerExecutor {
* @return true则继续执行往下执行
* @throws WeixinException
*/
public boolean applyPreHandle(WeixinRequest request, Object message)
public boolean applyPreHandle(WeixinRequest request, WeixinMessage message)
throws WeixinException {
if (messageInterceptors != null) {
for (int i = 0; i < messageInterceptors.length; i++) {
@ -90,7 +91,7 @@ public class MessageHandlerExecutor {
* @throws WeixinException
*/
public void applyPostHandle(WeixinRequest request, WeixinResponse response,
Object message) throws WeixinException {
WeixinMessage message) throws WeixinException {
if (messageInterceptors == null) {
return;
}
@ -115,7 +116,7 @@ public class MessageHandlerExecutor {
* @throws WeixinException
*/
public void triggerAfterCompletion(WeixinRequest request,
WeixinResponse response, Object message, Exception exception)
WeixinResponse response, WeixinMessage message, Exception exception)
throws WeixinException {
if (messageInterceptors == null) {
return;

View File

@ -125,7 +125,7 @@ public class WeixinMessageDispatcher {
WeixinMessageKey messageKey = defineMessageKey(messageTransfer, request);
Class<? extends WeixinMessage> targetClass = messageMatcher
.match(messageKey);
Object message = messageRead(request.getOriginalContent(), targetClass);
WeixinMessage message = messageRead(request.getOriginalContent(), targetClass);
logger.info("define '{}' matched '{}'", messageKey, targetClass);
MessageHandlerExecutor handlerExecutor = getHandlerExecutor(context,
request, messageKey, message, messageTransfer.getNodeNames());
@ -209,17 +209,17 @@ public class WeixinMessageDispatcher {
*/
protected MessageHandlerExecutor getHandlerExecutor(
ChannelHandlerContext context, WeixinRequest request,
WeixinMessageKey messageKey, Object message, Set<String> nodeNames)
WeixinMessageKey messageKey, WeixinMessage message, Set<String> nodeNames)
throws WeixinException {
WeixinMessageHandler[] messageHandlers = getMessageHandlers();
if (messageHandlers == null) {
return null;
}
logger.info("resolve handlers '{}'", this.messageHandlerList);
List<WeixinMessageHandler> matchedMessageHandlers = new ArrayList<WeixinMessageHandler>();
for (WeixinMessageHandler handler : messageHandlers) {
if (handler.canHandle(request, message, nodeNames)) {
matchedMessageHandlers.add(handler);
break;
}
}
if (matchedMessageHandlers.isEmpty()) {
@ -233,6 +233,7 @@ public class WeixinMessageDispatcher {
return m2.weight() - m1.weight();
}
});
logger.info("matched message handlers '{}'", matchedMessageHandlers);
return new MessageHandlerExecutor(context,
matchedMessageHandlers.get(0), getMessageInterceptors());
}
@ -254,9 +255,20 @@ public class WeixinMessageDispatcher {
}
if (beanFactory != null) {
for (Class<?> clazz : messageHandlerClass) {
messageHandlerList
.add((WeixinMessageHandler) beanFactory
.getBean(clazz));
try {
messageHandlerList
.add((WeixinMessageHandler) beanFactory
.getBean(clazz));
} catch (RuntimeException ex) { // multiple
for (Object o : beanFactory.getBeans(clazz)
.values()) {
if (o.getClass() == clazz) {
messageHandlerList
.add((WeixinMessageHandler) o);
break;
}
}
}
}
} else {
for (Class<?> clazz : messageHandlerClass) {
@ -305,9 +317,20 @@ public class WeixinMessageDispatcher {
}
if (beanFactory != null) {
for (Class<?> clazz : messageInterceptorClass) {
messageInterceptorList
.add((WeixinMessageInterceptor) beanFactory
.getBean(clazz));
try {
messageInterceptorList
.add((WeixinMessageInterceptor) beanFactory
.getBean(clazz));
} catch (RuntimeException ex) { // multiple
for (Object o : beanFactory.getBeans(clazz)
.values()) {
if (o.getClass() == clazz) {
messageInterceptorList
.add((WeixinMessageInterceptor) o);
break;
}
}
}
}
} else {
for (Class<?> clazz : messageInterceptorClass) {

View File

@ -3,6 +3,7 @@ package com.foxinmy.weixin4j.handler;
import java.util.Set;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.request.WeixinMessage;
import com.foxinmy.weixin4j.request.WeixinRequest;
import com.foxinmy.weixin4j.response.TextResponse;
import com.foxinmy.weixin4j.response.WeixinResponse;
@ -25,13 +26,13 @@ public class DebugMessageHandler implements WeixinMessageHandler {
}
@Override
public boolean canHandle(WeixinRequest request, Object message,
public boolean canHandle(WeixinRequest request, WeixinMessage message,
Set<String> nodeNames) throws WeixinException {
return true;
}
@Override
public WeixinResponse doHandle(WeixinRequest request, Object message,
public WeixinResponse doHandle(WeixinRequest request, WeixinMessage message,
Set<String> nodeNames) throws WeixinException {
String content = message == null ? request.getOriginalContent()
.replaceAll("\\!\\[CDATA\\[", "").replaceAll("\\]\\]", "")

View File

@ -22,10 +22,10 @@ public abstract class MessageHandlerAdapter<M extends WeixinMessage> implements
WeixinMessageHandler {
@Override
public boolean canHandle(WeixinRequest request, Object message,
public boolean canHandle(WeixinRequest request, WeixinMessage message,
Set<String> nodeNames) throws WeixinException {
return message != null
&& message.getClass() == ClassUtil.getGenericType(this)
&& message.getClass() == ClassUtil.getGenericType(getClass())
&& canHandle0(request, (M) message);
}
@ -36,7 +36,7 @@ public abstract class MessageHandlerAdapter<M extends WeixinMessage> implements
* 微信请求
* @param message
* 微信消息
* @return true则执行doHandler
* @return true则执行doHandler0
* @throws WeixinException
*/
public boolean canHandle0(WeixinRequest request, M message)
@ -45,8 +45,9 @@ public abstract class MessageHandlerAdapter<M extends WeixinMessage> implements
}
@Override
public WeixinResponse doHandle(WeixinRequest request, Object message,
Set<String> nodeNames) throws WeixinException {
public WeixinResponse doHandle(WeixinRequest request,
WeixinMessage message, Set<String> nodeNames)
throws WeixinException {
return doHandle0(request, (M) message);
}

View File

@ -3,6 +3,7 @@ package com.foxinmy.weixin4j.handler;
import java.util.Set;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.request.WeixinMessage;
import com.foxinmy.weixin4j.request.WeixinRequest;
import com.foxinmy.weixin4j.response.WeixinResponse;
@ -28,7 +29,7 @@ public interface WeixinMessageHandler {
* 节点名称集合
* @return true则执行doHandle
*/
public boolean canHandle(WeixinRequest request, Object message,
public boolean canHandle(WeixinRequest request, WeixinMessage message,
Set<String> nodeNames) throws WeixinException;
/**
@ -42,7 +43,7 @@ public interface WeixinMessageHandler {
* 节点名称集合
* @return 回复内容
*/
public WeixinResponse doHandle(WeixinRequest request, Object message,
public WeixinResponse doHandle(WeixinRequest request, WeixinMessage message,
Set<String> nodeNames) throws WeixinException;
/**

View File

@ -4,6 +4,7 @@ import io.netty.channel.ChannelHandlerContext;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.handler.WeixinMessageHandler;
import com.foxinmy.weixin4j.request.WeixinMessage;
import com.foxinmy.weixin4j.request.WeixinRequest;
import com.foxinmy.weixin4j.response.WeixinResponse;
@ -21,20 +22,20 @@ public abstract class MessageInterceptorAdapter implements
@Override
public boolean preHandle(ChannelHandlerContext context,
WeixinRequest request, Object message, WeixinMessageHandler handler)
WeixinRequest request, WeixinMessage message, WeixinMessageHandler handler)
throws WeixinException {
return true;
}
@Override
public void postHandle(ChannelHandlerContext context,
WeixinRequest request, WeixinResponse response, Object message,
WeixinRequest request, WeixinResponse response, WeixinMessage message,
WeixinMessageHandler handler) throws WeixinException {
}
@Override
public void afterCompletion(ChannelHandlerContext context,
WeixinRequest request, WeixinResponse response, Object message,
WeixinRequest request, WeixinResponse response, WeixinMessage message,
WeixinMessageHandler handler, Exception exception)
throws WeixinException {
}

View File

@ -4,6 +4,7 @@ import io.netty.channel.ChannelHandlerContext;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.handler.WeixinMessageHandler;
import com.foxinmy.weixin4j.request.WeixinMessage;
import com.foxinmy.weixin4j.request.WeixinRequest;
import com.foxinmy.weixin4j.response.WeixinResponse;
@ -33,7 +34,7 @@ public interface WeixinMessageInterceptor {
* @throws WeixinException
*/
boolean preHandle(ChannelHandlerContext context, WeixinRequest request,
Object message, WeixinMessageHandler handler)
WeixinMessage message, WeixinMessageHandler handler)
throws WeixinException;
/**
@ -52,7 +53,7 @@ public interface WeixinMessageInterceptor {
* @throws WeixinException
*/
void postHandle(ChannelHandlerContext context, WeixinRequest request,
WeixinResponse response, Object message,
WeixinResponse response, WeixinMessage message,
WeixinMessageHandler handler) throws WeixinException;
/**
@ -71,7 +72,7 @@ public interface WeixinMessageInterceptor {
* @throws WeixinException
*/
void afterCompletion(ChannelHandlerContext context, WeixinRequest request,
WeixinResponse response, Object message,
WeixinResponse response, WeixinMessage message,
WeixinMessageHandler handler, Exception exception)
throws WeixinException;

View File

@ -12,8 +12,8 @@ import java.lang.reflect.Type;
import java.net.JarURLConnection;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
@ -75,7 +75,7 @@ public final class ClassUtil {
* @return
*/
private static List<Class<?>> findClassesByFile(File dir, String packageName) {
List<Class<?>> classes = new LinkedList<Class<?>>();
List<Class<?>> classes = new ArrayList<Class<?>>();
File[] files = dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File file, String name) {
@ -111,23 +111,21 @@ public final class ClassUtil {
*/
private static List<Class<?>> findClassesByJar(JarFile jar,
String packageName) {
List<Class<?>> classes = new LinkedList<Class<?>>();
List<Class<?>> classes = new ArrayList<Class<?>>();
Enumeration<JarEntry> jarEntries = jar.entries();
while (jarEntries.hasMoreElements()) {
JarEntry jarEntry = jarEntries.nextElement();
if (jarEntry.isDirectory()) {
continue;
}
String entryName = jarEntry.getName();
if (!entryName.startsWith(packageName)) {
continue;
}
if (!entryName.endsWith(CLASS)) {
String className = jarEntry.getName()
.replace(File.separator, POINT);
if (!className.startsWith(packageName)
|| !className.endsWith(CLASS)) {
continue;
}
try {
classes.add(Class.forName(entryName.replace(File.separator,
POINT).replace(CLASS, "")));
classes.add(Class.forName(className.replace(CLASS, "")));
} catch (ClassNotFoundException e) {
;
}
@ -177,15 +175,17 @@ public final class ClassUtil {
* @param object
* @return
*/
public static Class<?> getGenericType(Object object) {
Class<?> clazz = null;
Type type = object.getClass().getGenericSuperclass();
public static Class<?> getGenericType(Class<?> clazz) {
if(clazz == Object.class){
return null;
}
Type type = clazz.getGenericSuperclass();
if (type instanceof ParameterizedType) {
ParameterizedType ptype = ((ParameterizedType) type);
Type[] args = ptype.getActualTypeArguments();
clazz = (Class<?>) args[0];
return (Class<?>) args[0];
}
return clazz;
return getGenericType(clazz.getSuperclass());
}
public static ClassLoader getDefaultClassLoader() {

View File

@ -1,13 +1,18 @@
package com.foxinmy.weixin4j.server.test;
import java.util.Set;
import io.netty.channel.ChannelHandlerContext;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.handler.DebugMessageHandler;
import com.foxinmy.weixin4j.handler.MessageHandlerAdapter;
import com.foxinmy.weixin4j.handler.MultipleMessageHandlerAdapter;
import com.foxinmy.weixin4j.handler.WeixinMessageHandler;
import com.foxinmy.weixin4j.interceptor.WeixinMessageInterceptor;
import com.foxinmy.weixin4j.message.TextMessage;
import com.foxinmy.weixin4j.mp.event.ScanEventMessage;
import com.foxinmy.weixin4j.request.WeixinMessage;
import com.foxinmy.weixin4j.request.WeixinRequest;
import com.foxinmy.weixin4j.response.TextResponse;
import com.foxinmy.weixin4j.response.WeixinResponse;
@ -84,7 +89,7 @@ public class MessageServerStartup {
WeixinMessageInterceptor interceptor = new WeixinMessageInterceptor() {
@Override
public boolean preHandle(ChannelHandlerContext context,
WeixinRequest request, Object message,
WeixinRequest request, WeixinMessage message,
WeixinMessageHandler handler) throws WeixinException {
context.writeAndFlush(new TextResponse("所有消息被拦截了!"));
return false;
@ -93,7 +98,7 @@ public class MessageServerStartup {
@Override
public void postHandle(ChannelHandlerContext context,
WeixinRequest request, WeixinResponse response,
Object message, WeixinMessageHandler handler)
WeixinMessage message, WeixinMessageHandler handler)
throws WeixinException {
System.err.println("preHandle返回为true,执行handler后");
}
@ -101,7 +106,7 @@ public class MessageServerStartup {
@Override
public void afterCompletion(ChannelHandlerContext context,
WeixinRequest request, WeixinResponse response,
Object message, WeixinMessageHandler handler,
WeixinMessage message, WeixinMessageHandler handler,
Exception exception) throws WeixinException {
System.err.println("请求处理完毕");
}
@ -115,7 +120,22 @@ public class MessageServerStartup {
.openAlwaysResponse().startup();
}
@SuppressWarnings("unchecked")
public void test6() throws WeixinException {
MultipleMessageHandlerAdapter messageHandler = new MultipleMessageHandlerAdapter(
ScanEventMessage.class, TextMessage.class) {
@Override
public WeixinResponse doHandle(WeixinRequest request,
WeixinMessage message, Set<String> nodeNames)
throws WeixinException {
return new TextResponse("处理了扫描和文字消息");
}
};
new WeixinServerBootstrap(token).addHandler(messageHandler,
DebugMessageHandler.global).startup();
}
public static void main(String[] args) throws Exception {
new MessageServerStartup().test1();
new MessageServerStartup().test6();
}
}