From 9c01692f57bf2a62cc9a655d231ee3a1a621e800 Mon Sep 17 00:00:00 2001 From: jinyu Date: Sat, 26 Dec 2015 18:31:20 +0800 Subject: [PATCH] =?UTF-8?q?weixin4j-server:WeixinMessageInterceptor?= =?UTF-8?q?=E5=8A=A0=E5=85=A5weight=E6=9D=83=E9=87=8D=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGE.md | 2 + .../dispatcher/WeixinMessageDispatcher.java | 51 ++++++++++--------- .../MessageInterceptorAdapter.java | 4 ++ .../interceptor/WeixinMessageInterceptor.java | 7 +++ .../weixin4j/server/test/MessagePush.java | 2 +- .../server/test/MessageServerStartup.java | 5 ++ 6 files changed, 46 insertions(+), 25 deletions(-) diff --git a/CHANGE.md b/CHANGE.md index 6cf7e674..c28e524c 100644 --- a/CHANGE.md +++ b/CHANGE.md @@ -601,4 +601,6 @@ * 2015-12-26 + weixin4j-base:MchPayRequest抽象化 + + + weixin4j-server:WeixinMessageInterceptor加入weight权重接口 \ No newline at end of file diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java index d4cea393..05278bf6 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/dispatcher/WeixinMessageDispatcher.java @@ -9,7 +9,6 @@ import io.netty.util.internal.logging.InternalLoggerFactory; import java.io.ByteArrayInputStream; import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; -import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -207,24 +206,13 @@ public class WeixinMessageDispatcher { if (messageHandlers == null) { return null; } - List matchingMessageHandlers = new ArrayList(); + WeixinMessageHandler messageHandler = null; for (WeixinMessageHandler handler : messageHandlers) { if (handler.canHandle(request, message, nodeNames)) { - matchingMessageHandlers.add(handler); + messageHandler = handler; + break; } } - if (matchingMessageHandlers.isEmpty()) { - return null; - } - Collections.sort(matchingMessageHandlers, - new Comparator() { - @Override - public int compare(WeixinMessageHandler m1, - WeixinMessageHandler m2) { - return m2.weight() - m1.weight(); - } - }); - WeixinMessageHandler messageHandler = matchingMessageHandlers.get(0); return new MessageHandlerExecutor(context, messageHandler, getMessageInterceptors()); } @@ -246,8 +234,8 @@ public class WeixinMessageDispatcher { } if (beanFactory != null) { for (Class clazz : messageHandlerClass) { - messageHandlerList.add(0, - (WeixinMessageHandler) beanFactory + messageHandlerList + .add((WeixinMessageHandler) beanFactory .getBean(clazz)); } } else { @@ -260,9 +248,8 @@ public class WeixinMessageDispatcher { Constructor ctor = clazz .getDeclaredConstructor(); ReflectionUtil.makeAccessible(ctor); - messageHandlerList.add(0, - (WeixinMessageHandler) ctor - .newInstance((Object[]) null)); + messageHandlerList.add((WeixinMessageHandler) ctor + .newInstance((Object[]) null)); } catch (Exception ex) { throw new WeixinException(clazz.getName() + " instantiate fail", ex); @@ -272,6 +259,14 @@ public class WeixinMessageDispatcher { } if (messageHandlerList != null && !this.messageHandlerList.isEmpty()) { + Collections.sort(messageHandlerList, + new Comparator() { + @Override + public int compare(WeixinMessageHandler m1, + WeixinMessageHandler m2) { + return m2.weight() - m1.weight(); + } + }); this.messageHandlers = this.messageHandlerList .toArray(new WeixinMessageHandler[this.messageHandlerList .size()]); @@ -298,8 +293,8 @@ public class WeixinMessageDispatcher { } if (beanFactory != null) { for (Class clazz : messageInterceptorClass) { - messageInterceptorList.add(0, - (WeixinMessageInterceptor) beanFactory + messageInterceptorList + .add((WeixinMessageInterceptor) beanFactory .getBean(clazz)); } } else { @@ -312,8 +307,8 @@ public class WeixinMessageDispatcher { Constructor ctor = clazz .getDeclaredConstructor(); ReflectionUtil.makeAccessible(ctor); - messageInterceptorList.add(0, - (WeixinMessageInterceptor) ctor + messageInterceptorList + .add((WeixinMessageInterceptor) ctor .newInstance((Object[]) null)); } catch (Exception ex) { throw new WeixinException(clazz.getName() @@ -324,6 +319,14 @@ public class WeixinMessageDispatcher { } if (this.messageInterceptorList != null && !this.messageInterceptorList.isEmpty()) { + Collections.sort(messageInterceptorList, + new Comparator() { + @Override + public int compare(WeixinMessageInterceptor m1, + WeixinMessageInterceptor m2) { + return m2.weight() - m1.weight(); + } + }); this.messageInterceptors = this.messageInterceptorList .toArray(new WeixinMessageInterceptor[this.messageInterceptorList .size()]); diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/MessageInterceptorAdapter.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/MessageInterceptorAdapter.java index dc2f8a00..cfdc10f5 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/MessageInterceptorAdapter.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/MessageInterceptorAdapter.java @@ -38,4 +38,8 @@ public abstract class MessageInterceptorAdapter implements WeixinMessageHandler handler, Exception exception) throws WeixinException { } + + public int weight() { + return 0; + } } diff --git a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/WeixinMessageInterceptor.java b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/WeixinMessageInterceptor.java index 1cb342e6..ddf13fb6 100644 --- a/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/WeixinMessageInterceptor.java +++ b/weixin4j-server/src/main/java/com/foxinmy/weixin4j/interceptor/WeixinMessageInterceptor.java @@ -74,4 +74,11 @@ public interface WeixinMessageInterceptor { WeixinResponse response, Object message, WeixinMessageHandler handler, Exception exception) throws WeixinException; + + /** + * 用于匹配到多个MessageHandler时权重降序排列,数字越大优先级越高 + * + * @return 权重 + */ + int weight(); } diff --git a/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessagePush.java b/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessagePush.java index 5239b718..440da68b 100644 --- a/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessagePush.java +++ b/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessagePush.java @@ -26,7 +26,7 @@ import com.foxinmy.weixin4j.util.Consts; */ public class MessagePush { - private final String server = "http://localhost:30000"; + private final String server = "http://localhost:10003"; private final HttpClient httpClient; private final HttpPost httpPost; private final HttpGet httpGet; diff --git a/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStartup.java b/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStartup.java index 40ad3a9c..369140b1 100644 --- a/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStartup.java +++ b/weixin4j-server/src/test/java/com/foxinmy/weixin4j/server/test/MessageServerStartup.java @@ -105,6 +105,11 @@ public class MessageServerStartup { Exception exception) throws WeixinException { System.err.println("请求处理完毕"); } + + @Override + public int weight() { + return 0; + } }; new WeixinServerBootstrap(token).addInterceptor(interceptor) .openAlwaysResponse().startup();