增加Priority功能, 可以对Service、Filter、HttpServlet的加载顺序进行优先级设置,同时删掉Filter的getIndex方法
This commit is contained in:
@@ -152,7 +152,12 @@ public class NodeHttpServer extends NodeServer {
|
|||||||
list.sort((FilterEntry<? extends Servlet> o1, FilterEntry<? extends Servlet> o2) -> { //必须保证WebSocketServlet优先加载, 因为要确保其他的HttpServlet可以注入本地模式的WebSocketNode
|
list.sort((FilterEntry<? extends Servlet> o1, FilterEntry<? extends Servlet> o2) -> { //必须保证WebSocketServlet优先加载, 因为要确保其他的HttpServlet可以注入本地模式的WebSocketNode
|
||||||
boolean ws1 = WebSocketServlet.class.isAssignableFrom(o1.getType());
|
boolean ws1 = WebSocketServlet.class.isAssignableFrom(o1.getType());
|
||||||
boolean ws2 = WebSocketServlet.class.isAssignableFrom(o2.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;
|
return ws1 ? -1 : 1;
|
||||||
});
|
});
|
||||||
final List<AbstractMap.SimpleEntry<String, String[]>> ss = sb == null ? null : new ArrayList<>();
|
final List<AbstractMap.SimpleEntry<String, String[]>> ss = sb == null ? null : new ArrayList<>();
|
||||||
|
|||||||
@@ -345,7 +345,7 @@ public abstract class NodeServer {
|
|||||||
} else {
|
} else {
|
||||||
service = Sncp.createRemoteService(serverClassLoader, resourceName, serviceImplClass, appTransportFactory, NodeServer.this.sncpAddress, groups, entry.getProperty());
|
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);
|
final Class restype = Sncp.getResourceType(service);
|
||||||
if (rf.find(resourceName, restype) == null) {
|
if (rf.find(resourceName, restype) == null) {
|
||||||
@@ -398,6 +398,11 @@ public abstract class NodeServer {
|
|||||||
//----------------- init -----------------
|
//----------------- init -----------------
|
||||||
List<Service> swlist = new ArrayList<>(localServices);
|
List<Service> swlist = new ArrayList<>(localServices);
|
||||||
Collections.sort(swlist, (o1, o2) -> {
|
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());
|
int rs = Sncp.getResourceType(o1).getName().compareTo(Sncp.getResourceType(o2).getName());
|
||||||
if (rs == 0) rs = Sncp.getResourceName(o1).compareTo(Sncp.getResourceName(o2));
|
if (rs == 0) rs = Sncp.getResourceName(o1).compareTo(Sncp.getResourceName(o2));
|
||||||
return rs;
|
return rs;
|
||||||
@@ -406,7 +411,7 @@ public abstract class NodeServer {
|
|||||||
localServices.addAll(swlist);
|
localServices.addAll(swlist);
|
||||||
final List<String> slist = sb == null ? null : new CopyOnWriteArrayList<>();
|
final List<String> slist = sb == null ? null : new CopyOnWriteArrayList<>();
|
||||||
CountDownLatch clds = new CountDownLatch(localServices.size());
|
CountDownLatch clds = new CountDownLatch(localServices.size());
|
||||||
localServices.parallelStream().forEach(y -> {
|
localServices.stream().forEach(y -> {
|
||||||
try {
|
try {
|
||||||
long s = System.currentTimeMillis();
|
long s = System.currentTimeMillis();
|
||||||
y.init(Sncp.getConf(y));
|
y.init(Sncp.getConf(y));
|
||||||
@@ -420,7 +425,6 @@ public abstract class NodeServer {
|
|||||||
clds.await();
|
clds.await();
|
||||||
if (slist != null && sb != null) {
|
if (slist != null && sb != null) {
|
||||||
List<String> wlist = new ArrayList<>(slist); //直接使用CopyOnWriteArrayList偶尔会出现莫名的异常(CopyOnWriteArrayList源码1185行)
|
List<String> wlist = new ArrayList<>(slist); //直接使用CopyOnWriteArrayList偶尔会出现莫名的异常(CopyOnWriteArrayList源码1185行)
|
||||||
Collections.sort(wlist);
|
|
||||||
for (String s : wlist) {
|
for (String s : wlist) {
|
||||||
sb.append(s);
|
sb.append(s);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,18 +33,11 @@ public abstract class Filter<C extends Context, R extends Request<C>, P extends
|
|||||||
public void destroy(C context, AnyValue config) {
|
public void destroy(C context, AnyValue config) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 值越小越靠前执行
|
|
||||||
*
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
public int getIndex() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final int compareTo(Object o) {
|
public final int compareTo(Object o) {
|
||||||
if (!(o instanceof Filter)) return 1;
|
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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import org.redkale.source.Flipper;
|
|||||||
*
|
*
|
||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
*/
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public final class Rest {
|
public final class Rest {
|
||||||
|
|
||||||
public static final String REST_HEADER_RESOURCE_NAME = "rest-resource-name";
|
public static final String REST_HEADER_RESOURCE_NAME = "rest-resource-name";
|
||||||
|
|||||||
27
src/org/redkale/util/Priority.java
Normal file
27
src/org/redkale/util/Priority.java
Normal file
@@ -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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 优先级, 值越小越靠前执行
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* 详情见: https://redkale.org
|
||||||
|
*
|
||||||
|
* @author zhangjx
|
||||||
|
*/
|
||||||
|
@Inherited
|
||||||
|
@Documented
|
||||||
|
@Target({TYPE, METHOD, FIELD})
|
||||||
|
@Retention(RUNTIME)
|
||||||
|
public @interface Priority {
|
||||||
|
|
||||||
|
int value() default 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user