weixin4j-server:WeixinMessageInterceptor加入weight权重接口

This commit is contained in:
jinyu 2015-12-26 18:31:20 +08:00
parent 763b1a66b9
commit 9c01692f57
6 changed files with 46 additions and 25 deletions

View File

@ -601,4 +601,6 @@
* 2015-12-26 * 2015-12-26
+ weixin4j-base:MchPayRequest抽象化 + weixin4j-base:MchPayRequest抽象化
+ weixin4j-server:WeixinMessageInterceptor加入weight权重接口

View File

@ -9,7 +9,6 @@ import io.netty.util.internal.logging.InternalLoggerFactory;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
@ -207,24 +206,13 @@ public class WeixinMessageDispatcher {
if (messageHandlers == null) { if (messageHandlers == null) {
return null; return null;
} }
List<WeixinMessageHandler> matchingMessageHandlers = new ArrayList<WeixinMessageHandler>(); WeixinMessageHandler messageHandler = null;
for (WeixinMessageHandler handler : messageHandlers) { for (WeixinMessageHandler handler : messageHandlers) {
if (handler.canHandle(request, message, nodeNames)) { if (handler.canHandle(request, message, nodeNames)) {
matchingMessageHandlers.add(handler); messageHandler = handler;
break;
} }
} }
if (matchingMessageHandlers.isEmpty()) {
return null;
}
Collections.sort(matchingMessageHandlers,
new Comparator<WeixinMessageHandler>() {
@Override
public int compare(WeixinMessageHandler m1,
WeixinMessageHandler m2) {
return m2.weight() - m1.weight();
}
});
WeixinMessageHandler messageHandler = matchingMessageHandlers.get(0);
return new MessageHandlerExecutor(context, messageHandler, return new MessageHandlerExecutor(context, messageHandler,
getMessageInterceptors()); getMessageInterceptors());
} }
@ -246,8 +234,8 @@ public class WeixinMessageDispatcher {
} }
if (beanFactory != null) { if (beanFactory != null) {
for (Class<?> clazz : messageHandlerClass) { for (Class<?> clazz : messageHandlerClass) {
messageHandlerList.add(0, messageHandlerList
(WeixinMessageHandler) beanFactory .add((WeixinMessageHandler) beanFactory
.getBean(clazz)); .getBean(clazz));
} }
} else { } else {
@ -260,9 +248,8 @@ public class WeixinMessageDispatcher {
Constructor<?> ctor = clazz Constructor<?> ctor = clazz
.getDeclaredConstructor(); .getDeclaredConstructor();
ReflectionUtil.makeAccessible(ctor); ReflectionUtil.makeAccessible(ctor);
messageHandlerList.add(0, messageHandlerList.add((WeixinMessageHandler) ctor
(WeixinMessageHandler) ctor .newInstance((Object[]) null));
.newInstance((Object[]) null));
} catch (Exception ex) { } catch (Exception ex) {
throw new WeixinException(clazz.getName() throw new WeixinException(clazz.getName()
+ " instantiate fail", ex); + " instantiate fail", ex);
@ -272,6 +259,14 @@ public class WeixinMessageDispatcher {
} }
if (messageHandlerList != null if (messageHandlerList != null
&& !this.messageHandlerList.isEmpty()) { && !this.messageHandlerList.isEmpty()) {
Collections.sort(messageHandlerList,
new Comparator<WeixinMessageHandler>() {
@Override
public int compare(WeixinMessageHandler m1,
WeixinMessageHandler m2) {
return m2.weight() - m1.weight();
}
});
this.messageHandlers = this.messageHandlerList this.messageHandlers = this.messageHandlerList
.toArray(new WeixinMessageHandler[this.messageHandlerList .toArray(new WeixinMessageHandler[this.messageHandlerList
.size()]); .size()]);
@ -298,8 +293,8 @@ public class WeixinMessageDispatcher {
} }
if (beanFactory != null) { if (beanFactory != null) {
for (Class<?> clazz : messageInterceptorClass) { for (Class<?> clazz : messageInterceptorClass) {
messageInterceptorList.add(0, messageInterceptorList
(WeixinMessageInterceptor) beanFactory .add((WeixinMessageInterceptor) beanFactory
.getBean(clazz)); .getBean(clazz));
} }
} else { } else {
@ -312,8 +307,8 @@ public class WeixinMessageDispatcher {
Constructor<?> ctor = clazz Constructor<?> ctor = clazz
.getDeclaredConstructor(); .getDeclaredConstructor();
ReflectionUtil.makeAccessible(ctor); ReflectionUtil.makeAccessible(ctor);
messageInterceptorList.add(0, messageInterceptorList
(WeixinMessageInterceptor) ctor .add((WeixinMessageInterceptor) ctor
.newInstance((Object[]) null)); .newInstance((Object[]) null));
} catch (Exception ex) { } catch (Exception ex) {
throw new WeixinException(clazz.getName() throw new WeixinException(clazz.getName()
@ -324,6 +319,14 @@ public class WeixinMessageDispatcher {
} }
if (this.messageInterceptorList != null if (this.messageInterceptorList != null
&& !this.messageInterceptorList.isEmpty()) { && !this.messageInterceptorList.isEmpty()) {
Collections.sort(messageInterceptorList,
new Comparator<WeixinMessageInterceptor>() {
@Override
public int compare(WeixinMessageInterceptor m1,
WeixinMessageInterceptor m2) {
return m2.weight() - m1.weight();
}
});
this.messageInterceptors = this.messageInterceptorList this.messageInterceptors = this.messageInterceptorList
.toArray(new WeixinMessageInterceptor[this.messageInterceptorList .toArray(new WeixinMessageInterceptor[this.messageInterceptorList
.size()]); .size()]);

View File

@ -38,4 +38,8 @@ public abstract class MessageInterceptorAdapter implements
WeixinMessageHandler handler, Exception exception) WeixinMessageHandler handler, Exception exception)
throws WeixinException { throws WeixinException {
} }
public int weight() {
return 0;
}
} }

View File

@ -74,4 +74,11 @@ public interface WeixinMessageInterceptor {
WeixinResponse response, Object message, WeixinResponse response, Object message,
WeixinMessageHandler handler, Exception exception) WeixinMessageHandler handler, Exception exception)
throws WeixinException; throws WeixinException;
/**
* 用于匹配到多个MessageHandler时权重降序排列,数字越大优先级越高
*
* @return 权重
*/
int weight();
} }

View File

@ -26,7 +26,7 @@ import com.foxinmy.weixin4j.util.Consts;
*/ */
public class MessagePush { public class MessagePush {
private final String server = "http://localhost:30000"; private final String server = "http://localhost:10003";
private final HttpClient httpClient; private final HttpClient httpClient;
private final HttpPost httpPost; private final HttpPost httpPost;
private final HttpGet httpGet; private final HttpGet httpGet;

View File

@ -105,6 +105,11 @@ public class MessageServerStartup {
Exception exception) throws WeixinException { Exception exception) throws WeixinException {
System.err.println("请求处理完毕"); System.err.println("请求处理完毕");
} }
@Override
public int weight() {
return 0;
}
}; };
new WeixinServerBootstrap(token).addInterceptor(interceptor) new WeixinServerBootstrap(token).addInterceptor(interceptor)
.openAlwaysResponse().startup(); .openAlwaysResponse().startup();