优化NodeHttpServer.loadRestServlet
This commit is contained in:
@@ -9,6 +9,7 @@ import java.lang.annotation.Annotation;
|
|||||||
import java.lang.reflect.*;
|
import java.lang.reflect.*;
|
||||||
import java.net.*;
|
import java.net.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import javax.annotation.*;
|
import javax.annotation.*;
|
||||||
import static org.redkale.boot.Application.RESNAME_SNCP_ADDR;
|
import static org.redkale.boot.Application.RESNAME_SNCP_ADDR;
|
||||||
@@ -244,35 +245,45 @@ public class NodeHttpServer extends NodeServer {
|
|||||||
|
|
||||||
final ClassFilter restFilter = ClassFilter.create(null, restConf.getValue("includes", ""), restConf.getValue("excludes", ""), includeValues, excludeValues);
|
final ClassFilter restFilter = ClassFilter.create(null, restConf.getValue("includes", ""), restConf.getValue("excludes", ""), includeValues, excludeValues);
|
||||||
final boolean finest = logger.isLoggable(Level.FINEST);
|
final boolean finest = logger.isLoggable(Level.FINEST);
|
||||||
super.interceptorServices.forEach((service) -> {
|
final CountDownLatch scdl = new CountDownLatch(super.interceptorServices.size());
|
||||||
final Class stype = Sncp.getServiceType(service);
|
super.interceptorServices.stream().parallel().forEach((service) -> {
|
||||||
final String name = Sncp.getResourceName(service);
|
try {
|
||||||
RestService rs = (RestService) stype.getAnnotation(RestService.class);
|
final Class stype = Sncp.getServiceType(service);
|
||||||
if (rs == null || rs.ignore()) return;
|
final String name = Sncp.getResourceName(service);
|
||||||
|
RestService rs = (RestService) stype.getAnnotation(RestService.class);
|
||||||
|
if (rs == null || rs.ignore()) return;
|
||||||
|
|
||||||
final String stypename = stype.getName();
|
final String stypename = stype.getName();
|
||||||
if (!autoload && !includeValues.contains(stypename)) return;
|
if (!autoload && !includeValues.contains(stypename)) return;
|
||||||
if (!restFilter.accept(stypename)) return;
|
if (!restFilter.accept(stypename)) return;
|
||||||
if (restedObjects.contains(service)) {
|
synchronized (restedObjects) {
|
||||||
logger.log(Level.WARNING, stype.getName() + " repeat create rest servlet, so ignore");
|
if (restedObjects.contains(service)) {
|
||||||
return;
|
logger.log(Level.WARNING, stype.getName() + " repeat create rest servlet, so ignore");
|
||||||
}
|
return;
|
||||||
restedObjects.add(service); //避免重复创建Rest对象
|
}
|
||||||
HttpServlet servlet = httpServer.addRestServlet(serverClassLoader, service, userType, baseServletType, prefix);
|
restedObjects.add(service); //避免重复创建Rest对象
|
||||||
if (servlet == null) return; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null
|
|
||||||
String prefix2 = prefix;
|
|
||||||
WebServlet ws = servlet.getClass().getAnnotation(WebServlet.class);
|
|
||||||
if (ws != null && !ws.repair()) prefix2 = "";
|
|
||||||
resourceFactory.inject(servlet, NodeHttpServer.this);
|
|
||||||
//if (finest) logger.finest(threadName + " Create RestServlet(resource.name='" + name + "') = " + servlet);
|
|
||||||
if (ss != null) {
|
|
||||||
String[] mappings = servlet.getClass().getAnnotation(WebServlet.class).value();
|
|
||||||
for (int i = 0; i < mappings.length; i++) {
|
|
||||||
mappings[i] = prefix2 + mappings[i];
|
|
||||||
}
|
}
|
||||||
ss.add(new AbstractMap.SimpleEntry<>(servlet.getClass().getName() + "(rest.name='" + name + "')", mappings));
|
HttpServlet servlet = httpServer.addRestServlet(serverClassLoader, service, userType, baseServletType, prefix);
|
||||||
|
if (servlet == null) return; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null
|
||||||
|
String prefix2 = prefix;
|
||||||
|
WebServlet ws = servlet.getClass().getAnnotation(WebServlet.class);
|
||||||
|
if (ws != null && !ws.repair()) prefix2 = "";
|
||||||
|
resourceFactory.inject(servlet, NodeHttpServer.this);
|
||||||
|
//if (finest) logger.finest(threadName + " Create RestServlet(resource.name='" + name + "') = " + servlet);
|
||||||
|
if (ss != null) {
|
||||||
|
String[] mappings = servlet.getClass().getAnnotation(WebServlet.class).value();
|
||||||
|
for (int i = 0; i < mappings.length; i++) {
|
||||||
|
mappings[i] = prefix2 + mappings[i];
|
||||||
|
}
|
||||||
|
synchronized (ss) {
|
||||||
|
ss.add(new AbstractMap.SimpleEntry<>(servlet.getClass().getName() + "(rest.name='" + name + "')", mappings));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
scdl.countDown();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
scdl.await();
|
||||||
}
|
}
|
||||||
if (webSocketFilter != null) { //加载RestWebSocket
|
if (webSocketFilter != null) { //加载RestWebSocket
|
||||||
final Set<String> includeValues = new HashSet<>();
|
final Set<String> includeValues = new HashSet<>();
|
||||||
|
|||||||
Reference in New Issue
Block a user