diff --git a/src/org/redkale/boot/NodeHttpServer.java b/src/org/redkale/boot/NodeHttpServer.java index 9777d2378..a5b4274e6 100644 --- a/src/org/redkale/boot/NodeHttpServer.java +++ b/src/org/redkale/boot/NodeHttpServer.java @@ -152,7 +152,12 @@ public class NodeHttpServer extends NodeServer { list.sort((FilterEntry o1, FilterEntry o2) -> { //必须保证WebSocketServlet优先加载, 因为要确保其他的HttpServlet可以注入本地模式的WebSocketNode boolean ws1 = WebSocketServlet.class.isAssignableFrom(o1.getType()); boolean ws2 = WebSocketServlet.class.isAssignableFrom(o2.getType()); - if (ws1 == ws2) return o1.getType().getName().compareTo(o2.getType().getName()); + if (ws1 == ws2) { + Priority p1 = o1.getType().getAnnotation(Priority.class); + Priority p2 = o2.getType().getAnnotation(Priority.class); + int v = (p1 == null ? 0 : p1.value()) - (p2 == null ? 0 : p2.value()); + return v == 0 ? o1.getType().getName().compareTo(o2.getType().getName()) : 0; + } return ws1 ? -1 : 1; }); final List> ss = sb == null ? null : new ArrayList<>(); diff --git a/src/org/redkale/boot/NodeServer.java b/src/org/redkale/boot/NodeServer.java index f448fbb37..69027dc75 100644 --- a/src/org/redkale/boot/NodeServer.java +++ b/src/org/redkale/boot/NodeServer.java @@ -345,7 +345,7 @@ public abstract class NodeServer { } else { service = Sncp.createRemoteService(serverClassLoader, resourceName, serviceImplClass, appTransportFactory, NodeServer.this.sncpAddress, groups, entry.getProperty()); } - if (SncpClient.parseMethod(serviceImplClass).isEmpty()) return; //class没有可用的方法, 通常为BaseService + if (SncpClient.parseMethod(serviceImplClass).isEmpty() && serviceImplClass.getAnnotation(Priority.class) == null) return; //class没有可用的方法且没有标记启动优先级的, 通常为BaseService final Class restype = Sncp.getResourceType(service); if (rf.find(resourceName, restype) == null) { @@ -398,6 +398,11 @@ public abstract class NodeServer { //----------------- init ----------------- List swlist = new ArrayList<>(localServices); Collections.sort(swlist, (o1, o2) -> { + Priority p1 = o1.getClass().getAnnotation(Priority.class); + Priority p2 = o2.getClass().getAnnotation(Priority.class); + int v1 = p1 == null ? 0 : p1.value(); + int v2 = p2 == null ? 0 : p2.value(); + if (v1 != v2) return v1 - v2; int rs = Sncp.getResourceType(o1).getName().compareTo(Sncp.getResourceType(o2).getName()); if (rs == 0) rs = Sncp.getResourceName(o1).compareTo(Sncp.getResourceName(o2)); return rs; @@ -406,7 +411,7 @@ public abstract class NodeServer { localServices.addAll(swlist); final List slist = sb == null ? null : new CopyOnWriteArrayList<>(); CountDownLatch clds = new CountDownLatch(localServices.size()); - localServices.parallelStream().forEach(y -> { + localServices.stream().forEach(y -> { try { long s = System.currentTimeMillis(); y.init(Sncp.getConf(y)); @@ -420,7 +425,6 @@ public abstract class NodeServer { clds.await(); if (slist != null && sb != null) { List wlist = new ArrayList<>(slist); //直接使用CopyOnWriteArrayList偶尔会出现莫名的异常(CopyOnWriteArrayList源码1185行) - Collections.sort(wlist); for (String s : wlist) { sb.append(s); } diff --git a/src/org/redkale/net/Filter.java b/src/org/redkale/net/Filter.java index ee3f6077d..956e5d4ed 100644 --- a/src/org/redkale/net/Filter.java +++ b/src/org/redkale/net/Filter.java @@ -33,18 +33,11 @@ public abstract class Filter, P extends public void destroy(C context, AnyValue config) { } - /** - * 值越小越靠前执行 - * - * @return int - */ - public int getIndex() { - return 0; - } - @Override public final int compareTo(Object o) { if (!(o instanceof Filter)) return 1; - return this.getIndex() - ((Filter) o).getIndex(); + Priority p1 = this.getClass().getAnnotation(Priority.class); + Priority p2 = o.getClass().getAnnotation(Priority.class); + return (p1 == null ? 0 : p1.value()) - (p2 == null ? 0 : p2.value()); } } diff --git a/src/org/redkale/net/http/Rest.java b/src/org/redkale/net/http/Rest.java index a0aa402d0..b66604f52 100644 --- a/src/org/redkale/net/http/Rest.java +++ b/src/org/redkale/net/http/Rest.java @@ -29,6 +29,7 @@ import org.redkale.source.Flipper; * * @author zhangjx */ +@SuppressWarnings("unchecked") public final class Rest { public static final String REST_HEADER_RESOURCE_NAME = "rest-resource-name"; diff --git a/src/org/redkale/util/Priority.java b/src/org/redkale/util/Priority.java new file mode 100644 index 000000000..2247ccf9a --- /dev/null +++ b/src/org/redkale/util/Priority.java @@ -0,0 +1,27 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkale.util; + +import java.lang.annotation.*; +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * 优先级, 值越小越靠前执行 + * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + */ +@Inherited +@Documented +@Target({TYPE, METHOD, FIELD}) +@Retention(RUNTIME) +public @interface Priority { + + int value() default 0; +}