This commit is contained in:
@@ -617,7 +617,7 @@ public final class Application {
|
|||||||
if (!inited.get()) {
|
if (!inited.get()) {
|
||||||
synchronized (nodeClasses) {
|
synchronized (nodeClasses) {
|
||||||
if (!inited.getAndSet(true)) { //加载自定义的协议,如:SOCKS
|
if (!inited.getAndSet(true)) { //加载自定义的协议,如:SOCKS
|
||||||
ClassFilter profilter = new ClassFilter(NodeProtocol.class, NodeServer.class, (Class[]) null);
|
ClassFilter profilter = new ClassFilter(classLoader, NodeProtocol.class, NodeServer.class, (Class[]) null);
|
||||||
ClassFilter.Loader.load(home, serconf.getValue("excludelibs", "").split(";"), profilter);
|
ClassFilter.Loader.load(home, serconf.getValue("excludelibs", "").split(";"), profilter);
|
||||||
final Set<FilterEntry<NodeServer>> entrys = profilter.getFilterEntrys();
|
final Set<FilterEntry<NodeServer>> entrys = profilter.getFilterEntrys();
|
||||||
for (FilterEntry<NodeServer> entry : entrys) {
|
for (FilterEntry<NodeServer> entry : entrys) {
|
||||||
|
|||||||
@@ -58,19 +58,22 @@ public final class ClassFilter<T> {
|
|||||||
|
|
||||||
private AnyValue conf; //基本配置信息, 当符合条件时将conf的属性赋值到FilterEntry中去。
|
private AnyValue conf; //基本配置信息, 当符合条件时将conf的属性赋值到FilterEntry中去。
|
||||||
|
|
||||||
public ClassFilter(Class<? extends Annotation> annotationClass, Class superClass, Class[] excludeSuperClasses) {
|
private final ClassLoader classLoader;
|
||||||
this(annotationClass, superClass, excludeSuperClasses, null);
|
|
||||||
|
public ClassFilter(ClassLoader classLoader, Class<? extends Annotation> annotationClass, Class superClass, Class[] excludeSuperClasses) {
|
||||||
|
this(classLoader, annotationClass, superClass, excludeSuperClasses, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ClassFilter(Class<? extends Annotation> annotationClass, Class superClass, Class[] excludeSuperClasses, AnyValue conf) {
|
public ClassFilter(ClassLoader classLoader, Class<? extends Annotation> annotationClass, Class superClass, Class[] excludeSuperClasses, AnyValue conf) {
|
||||||
this.annotationClass = annotationClass;
|
this.annotationClass = annotationClass;
|
||||||
this.superClass = superClass;
|
this.superClass = superClass;
|
||||||
this.excludeSuperClasses = excludeSuperClasses;
|
this.excludeSuperClasses = excludeSuperClasses;
|
||||||
this.conf = conf;
|
this.conf = conf;
|
||||||
|
this.classLoader = classLoader == null ? Thread.currentThread().getContextClassLoader() : classLoader;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ClassFilter create(Class[] excludeSuperClasses, String includeregs, String excluderegs, Set<String> includeValues, Set<String> excludeValues) {
|
public static ClassFilter create(Class[] excludeSuperClasses, String includeregs, String excluderegs, Set<String> includeValues, Set<String> excludeValues) {
|
||||||
ClassFilter filter = new ClassFilter(null, null, excludeSuperClasses);
|
ClassFilter filter = new ClassFilter(null, null, null, excludeSuperClasses);
|
||||||
filter.setIncludePatterns(includeregs == null ? null : includeregs.split(";"));
|
filter.setIncludePatterns(includeregs == null ? null : includeregs.split(";"));
|
||||||
filter.setExcludePatterns(excluderegs == null ? null : excluderegs.split(";"));
|
filter.setExcludePatterns(excluderegs == null ? null : excluderegs.split(";"));
|
||||||
filter.setPrivilegeIncludes(includeValues);
|
filter.setPrivilegeIncludes(includeValues);
|
||||||
@@ -156,7 +159,7 @@ public final class ClassFilter<T> {
|
|||||||
}
|
}
|
||||||
if (cf == null || clazzname.startsWith("sun.")) return;
|
if (cf == null || clazzname.startsWith("sun.")) return;
|
||||||
try {
|
try {
|
||||||
Class clazz = Class.forName(clazzname);
|
Class clazz = classLoader.loadClass(clazzname);
|
||||||
if (!cf.accept(property, clazz, autoscan)) return;
|
if (!cf.accept(property, clazz, autoscan)) return;
|
||||||
if (cf.conf != null) {
|
if (cf.conf != null) {
|
||||||
if (property == null) {
|
if (property == null) {
|
||||||
@@ -180,7 +183,7 @@ public final class ClassFilter<T> {
|
|||||||
} catch (Throwable cfe) {
|
} catch (Throwable cfe) {
|
||||||
if (finer && !clazzname.startsWith("sun.") && !clazzname.startsWith("javax.")
|
if (finer && !clazzname.startsWith("sun.") && !clazzname.startsWith("javax.")
|
||||||
&& !clazzname.startsWith("com.sun.") && !clazzname.startsWith("jdk.")) {
|
&& !clazzname.startsWith("com.sun.") && !clazzname.startsWith("jdk.")) {
|
||||||
//logger.log(Level.FINEST, ClassFilter.class.getSimpleName() + " filter error", cfe);
|
logger.log(Level.FINEST, ClassFilter.class.getSimpleName() + " filter error", cfe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ public class NodeHttpServer extends NodeServer {
|
|||||||
synchronized (regFactory) {
|
synchronized (regFactory) {
|
||||||
Service nodeService = (Service) rf.find(resourceName, WebSocketNode.class);
|
Service nodeService = (Service) rf.find(resourceName, WebSocketNode.class);
|
||||||
if (nodeService == null) {
|
if (nodeService == null) {
|
||||||
nodeService = Sncp.createLocalService(resourceName, WebSocketNodeService.class, application.getResourceFactory(), application.getTransportFactory(), (InetSocketAddress) null, (Set<String>) null, (AnyValue) null);
|
nodeService = Sncp.createLocalService(classLoader, resourceName, WebSocketNodeService.class, application.getResourceFactory(), application.getTransportFactory(), (InetSocketAddress) null, (Set<String>) null, (AnyValue) null);
|
||||||
regFactory.register(resourceName, WebSocketNode.class, nodeService);
|
regFactory.register(resourceName, WebSocketNode.class, nodeService);
|
||||||
}
|
}
|
||||||
resourceFactory.inject(nodeService, self);
|
resourceFactory.inject(nodeService, self);
|
||||||
@@ -210,8 +210,9 @@ public class NodeHttpServer extends NodeServer {
|
|||||||
final boolean autoload = restConf.getBoolValue("autoload", true);
|
final boolean autoload = restConf.getBoolValue("autoload", true);
|
||||||
{ //加载RestService
|
{ //加载RestService
|
||||||
String userTypeStr = restConf.getValue("usertype");
|
String userTypeStr = restConf.getValue("usertype");
|
||||||
final Class userType = userTypeStr == null ? null : Class.forName(userTypeStr);
|
final Class userType = userTypeStr == null ? null : this.classLoader.loadClass(userTypeStr);
|
||||||
final Class baseServletType = Class.forName(restConf.getValue("base", HttpServlet.class.getName()));
|
|
||||||
|
final Class baseServletType = this.classLoader.loadClass(restConf.getValue("base", HttpServlet.class.getName()));
|
||||||
final Set<String> includeValues = new HashSet<>();
|
final Set<String> includeValues = new HashSet<>();
|
||||||
final Set<String> excludeValues = new HashSet<>();
|
final Set<String> excludeValues = new HashSet<>();
|
||||||
for (AnyValue item : restConf.getAnyValues("service")) {
|
for (AnyValue item : restConf.getAnyValues("service")) {
|
||||||
@@ -238,7 +239,7 @@ public class NodeHttpServer extends NodeServer {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
restedObjects.add(service); //避免重复创建Rest对象
|
restedObjects.add(service); //避免重复创建Rest对象
|
||||||
HttpServlet servlet = httpServer.addRestServlet(service, userType, baseServletType, prefix);
|
HttpServlet servlet = httpServer.addRestServlet(classLoader, service, userType, baseServletType, prefix);
|
||||||
if (servlet == null) return; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null
|
if (servlet == null) return; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null
|
||||||
resourceFactory.inject(servlet, NodeHttpServer.this);
|
resourceFactory.inject(servlet, NodeHttpServer.this);
|
||||||
if (finest) logger.finest(threadName + " Create RestServlet(resource.name='" + name + "') = " + servlet);
|
if (finest) logger.finest(threadName + " Create RestServlet(resource.name='" + name + "') = " + servlet);
|
||||||
@@ -288,7 +289,7 @@ public class NodeHttpServer extends NodeServer {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
restedObjects.add(stype); //避免重复创建Rest对象
|
restedObjects.add(stype); //避免重复创建Rest对象
|
||||||
HttpServlet servlet = httpServer.addRestWebSocketServlet(stype, prefix, en.getProperty());
|
HttpServlet servlet = httpServer.addRestWebSocketServlet(classLoader, stype, prefix, en.getProperty());
|
||||||
if (servlet == null) return; //没有RestOnMessage方法的HttpServlet调用Rest.createRestWebSocketServlet就会返回null
|
if (servlet == null) return; //没有RestOnMessage方法的HttpServlet调用Rest.createRestWebSocketServlet就会返回null
|
||||||
resourceFactory.inject(servlet, NodeHttpServer.this);
|
resourceFactory.inject(servlet, NodeHttpServer.this);
|
||||||
if (finest) logger.finest(threadName + " " + stype.getName() + " create RestWebSocketServlet " + servlet);
|
if (finest) logger.finest(threadName + " " + stype.getName() + " create RestWebSocketServlet " + servlet);
|
||||||
|
|||||||
@@ -131,7 +131,8 @@ public abstract class NodeServer {
|
|||||||
resourceFactory.register(Server.RESNAME_SERVER_ROOT, Path.class, myroot.toPath());
|
resourceFactory.register(Server.RESNAME_SERVER_ROOT, Path.class, myroot.toPath());
|
||||||
|
|
||||||
//加入指定的classpath
|
//加入指定的classpath
|
||||||
Server.loadLib(classLoader, logger, (isWATCH() ? "${APP_HOME}/lib/*;" : "") + this.serverConf.getValue("lib", "${APP_HOME}/libs/*").replace("${APP_HOME}", application.getHome().getPath()));
|
Server.loadLib(classLoader, logger, this.serverConf.getValue("lib", "${APP_HOME}/libs/*").replace("${APP_HOME}", application.getHome().getPath().replace('\\', '/')));
|
||||||
|
Thread.currentThread().setContextClassLoader(this.classLoader);
|
||||||
}
|
}
|
||||||
//必须要进行初始化, 构建Service时需要使用Context中的ExecutorService
|
//必须要进行初始化, 构建Service时需要使用Context中的ExecutorService
|
||||||
server.init(this.serverConf);
|
server.init(this.serverConf);
|
||||||
@@ -139,7 +140,7 @@ public abstract class NodeServer {
|
|||||||
initResource(); //给 DataSource、CacheSource 注册依赖注入时的监听回调事件。
|
initResource(); //给 DataSource、CacheSource 注册依赖注入时的监听回调事件。
|
||||||
String interceptorClass = this.serverConf.getValue("interceptor", "");
|
String interceptorClass = this.serverConf.getValue("interceptor", "");
|
||||||
if (!interceptorClass.isEmpty()) {
|
if (!interceptorClass.isEmpty()) {
|
||||||
Class clazz = Class.forName(interceptorClass);
|
Class clazz = classLoader.loadClass(interceptorClass);
|
||||||
this.interceptor = (NodeInterceptor) clazz.newInstance();
|
this.interceptor = (NodeInterceptor) clazz.newInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,7 +174,7 @@ public abstract class NodeServer {
|
|||||||
if (resources != null) {
|
if (resources != null) {
|
||||||
for (AnyValue sourceConf : resources.getAnyValues("source")) {
|
for (AnyValue sourceConf : resources.getAnyValues("source")) {
|
||||||
try {
|
try {
|
||||||
Class type = Class.forName(sourceConf.getValue("value"));
|
Class type = classLoader.loadClass(sourceConf.getValue("value"));
|
||||||
if (!Service.class.isAssignableFrom(type)) {
|
if (!Service.class.isAssignableFrom(type)) {
|
||||||
logger.log(Level.SEVERE, "load application source resource, but not Service error: " + sourceConf);
|
logger.log(Level.SEVERE, "load application source resource, but not Service error: " + sourceConf);
|
||||||
} else if (CacheSource.class.isAssignableFrom(type)) {
|
} else if (CacheSource.class.isAssignableFrom(type)) {
|
||||||
@@ -229,7 +230,7 @@ public abstract class NodeServer {
|
|||||||
final Set<String> groups = new HashSet<>();
|
final Set<String> groups = new HashSet<>();
|
||||||
if (client != null && client.getSameGroup() != null) groups.add(client.getSameGroup());
|
if (client != null && client.getSameGroup() != null) groups.add(client.getSameGroup());
|
||||||
if (client != null && client.getDiffGroups() != null) groups.addAll(client.getDiffGroups());
|
if (client != null && client.getDiffGroups() != null) groups.addAll(client.getDiffGroups());
|
||||||
Service cacheListenerService = Sncp.createLocalService(resourceName, DataCacheListenerService.class, appResFactory, appTranFactory, sncpAddr, groups, Sncp.getConf((Service) src));
|
Service cacheListenerService = Sncp.createLocalService(classLoader, resourceName, DataCacheListenerService.class, appResFactory, appTranFactory, sncpAddr, groups, Sncp.getConf((Service) src));
|
||||||
appResFactory.register(resourceName, DataCacheListener.class, cacheListenerService);
|
appResFactory.register(resourceName, DataCacheListener.class, cacheListenerService);
|
||||||
localServices.add(cacheListenerService);
|
localServices.add(cacheListenerService);
|
||||||
sncpServer.consumerAccept(cacheListenerService);
|
sncpServer.consumerAccept(cacheListenerService);
|
||||||
@@ -255,11 +256,11 @@ public abstract class NodeServer {
|
|||||||
SncpClient client = Sncp.getSncpClient(srcService);
|
SncpClient client = Sncp.getSncpClient(srcService);
|
||||||
final InetSocketAddress sncpAddr = client == null ? null : client.getClientAddress();
|
final InetSocketAddress sncpAddr = client == null ? null : client.getClientAddress();
|
||||||
final AnyValue sourceConf = cacheResource.get(resourceName);
|
final AnyValue sourceConf = cacheResource.get(resourceName);
|
||||||
final Class sourceType = sourceConf == null ? CacheMemorySource.class : Class.forName(sourceConf.getValue("type"));
|
final Class sourceType = sourceConf == null ? CacheMemorySource.class : classLoader.loadClass(sourceConf.getValue("type"));
|
||||||
final Set<String> groups = new HashSet<>();
|
final Set<String> groups = new HashSet<>();
|
||||||
if (client != null && client.getSameGroup() != null) groups.add(client.getSameGroup());
|
if (client != null && client.getSameGroup() != null) groups.add(client.getSameGroup());
|
||||||
if (client != null && client.getDiffGroups() != null) groups.addAll(client.getDiffGroups());
|
if (client != null && client.getDiffGroups() != null) groups.addAll(client.getDiffGroups());
|
||||||
final CacheSource source = (CacheSource) Sncp.createLocalService(resourceName, sourceType, appResFactory, appTranFactory, sncpAddr, groups, Sncp.getConf(srcService));
|
final CacheSource source = (CacheSource) Sncp.createLocalService(classLoader, resourceName, sourceType, appResFactory, appTranFactory, sncpAddr, groups, Sncp.getConf(srcService));
|
||||||
Type genericType = field.getGenericType();
|
Type genericType = field.getGenericType();
|
||||||
ParameterizedType pt = (genericType instanceof ParameterizedType) ? (ParameterizedType) genericType : null;
|
ParameterizedType pt = (genericType instanceof ParameterizedType) ? (ParameterizedType) genericType : null;
|
||||||
Type valType = pt == null ? null : pt.getActualTypeArguments()[1];
|
Type valType = pt == null ? null : pt.getActualTypeArguments()[1];
|
||||||
@@ -330,9 +331,9 @@ public abstract class NodeServer {
|
|||||||
Service service;
|
Service service;
|
||||||
boolean ws = src instanceof WebSocketServlet;
|
boolean ws = src instanceof WebSocketServlet;
|
||||||
if (ws || localed) { //本地模式
|
if (ws || localed) { //本地模式
|
||||||
service = Sncp.createLocalService(resourceName, serviceImplClass, appResourceFactory, appTransportFactory, NodeServer.this.sncpAddress, groups, entry.getProperty());
|
service = Sncp.createLocalService(classLoader, resourceName, serviceImplClass, appResourceFactory, appTransportFactory, NodeServer.this.sncpAddress, groups, entry.getProperty());
|
||||||
} else {
|
} else {
|
||||||
service = Sncp.createRemoteService(resourceName, serviceImplClass, appTransportFactory, NodeServer.this.sncpAddress, groups, entry.getProperty());
|
service = Sncp.createRemoteService(classLoader, resourceName, serviceImplClass, appTransportFactory, NodeServer.this.sncpAddress, groups, entry.getProperty());
|
||||||
}
|
}
|
||||||
if (SncpClient.parseMethod(serviceImplClass).isEmpty()) return; //class没有可用的方法, 通常为BaseService
|
if (SncpClient.parseMethod(serviceImplClass).isEmpty()) return; //class没有可用的方法, 通常为BaseService
|
||||||
|
|
||||||
@@ -436,7 +437,7 @@ public abstract class NodeServer {
|
|||||||
|
|
||||||
protected ClassFilter createClassFilter(final String localGroup, Class<? extends Annotation> ref,
|
protected ClassFilter createClassFilter(final String localGroup, Class<? extends Annotation> ref,
|
||||||
Class inter, Class[] excludeSuperClasses, Class<? extends Annotation> ref2, String properties, String property) {
|
Class inter, Class[] excludeSuperClasses, Class<? extends Annotation> ref2, String properties, String property) {
|
||||||
ClassFilter cf = new ClassFilter(ref, inter, excludeSuperClasses, null);
|
ClassFilter cf = new ClassFilter(this.classLoader, ref, inter, excludeSuperClasses, null);
|
||||||
if (properties == null && properties == null) {
|
if (properties == null && properties == null) {
|
||||||
cf.setRefused(true);
|
cf.setRefused(true);
|
||||||
return cf;
|
return cf;
|
||||||
@@ -463,7 +464,7 @@ public abstract class NodeServer {
|
|||||||
prop = new AnyValue.DefaultAnyValue();
|
prop = new AnyValue.DefaultAnyValue();
|
||||||
prop.addValue("groups", sc);
|
prop.addValue("groups", sc);
|
||||||
}
|
}
|
||||||
ClassFilter filter = new ClassFilter(ref, inter, excludeSuperClasses, prop);
|
ClassFilter filter = new ClassFilter(this.classLoader, ref, inter, excludeSuperClasses, prop);
|
||||||
for (AnyValue av : list.getAnyValues(property)) { // <service>、<filter>、<servlet> 节点
|
for (AnyValue av : list.getAnyValues(property)) { // <service>、<filter>、<servlet> 节点
|
||||||
final AnyValue[] items = av.getAnyValues("property");
|
final AnyValue[] items = av.getAnyValues("property");
|
||||||
if (av instanceof DefaultAnyValue && items.length > 0) { //存在 <property>节点
|
if (av instanceof DefaultAnyValue && items.length > 0) { //存在 <property>节点
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ public abstract class ConvertFactory<R extends Reader, W extends Writer> {
|
|||||||
|
|
||||||
Class clazz = findEntityAlias(name);
|
Class clazz = findEntityAlias(name);
|
||||||
try {
|
try {
|
||||||
return clazz == null ? Class.forName(name) : clazz;
|
return clazz == null ? Thread.currentThread().getContextClassLoader().loadClass(name) : clazz;
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
throw new ConvertException("convert entity is " + name, ex);
|
throw new ConvertException("convert entity is " + name, ex);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ public class TypeSimpledCoder<R extends Reader, W extends Writer> extends Simple
|
|||||||
String str = in.readSmallString();
|
String str = in.readSmallString();
|
||||||
if (str == null) return null;
|
if (str == null) return null;
|
||||||
try {
|
try {
|
||||||
return Class.forName(str);
|
return Thread.currentThread().getContextClassLoader().loadClass(str);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -222,7 +222,7 @@ public class HttpPrepareServlet extends PrepareServlet<String, HttpContext, Http
|
|||||||
}
|
}
|
||||||
String resServlet = resConfig.getValue("servlet", HttpResourceServlet.class.getName());
|
String resServlet = resConfig.getValue("servlet", HttpResourceServlet.class.getName());
|
||||||
try {
|
try {
|
||||||
this.resourceHttpServlet = (HttpServlet) Class.forName(resServlet).newInstance();
|
this.resourceHttpServlet = (HttpServlet) Thread.currentThread().getContextClassLoader().loadClass(resServlet).newInstance();
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
this.resourceHttpServlet = new HttpResourceServlet();
|
this.resourceHttpServlet = new HttpResourceServlet();
|
||||||
logger.log(Level.WARNING, "init HttpResourceSerlvet(" + resServlet + ") error", e);
|
logger.log(Level.WARNING, "init HttpResourceSerlvet(" + resServlet + ") error", e);
|
||||||
|
|||||||
@@ -172,14 +172,15 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
*
|
*
|
||||||
* @param <S> WebSocket
|
* @param <S> WebSocket
|
||||||
* @param <T> HttpServlet
|
* @param <T> HttpServlet
|
||||||
|
* @param classLoader ClassLoader
|
||||||
* @param webSocketType WebSocket的类型
|
* @param webSocketType WebSocket的类型
|
||||||
* @param prefix url前缀
|
* @param prefix url前缀
|
||||||
* @param conf 配置信息
|
* @param conf 配置信息
|
||||||
*
|
*
|
||||||
* @return RestServlet
|
* @return RestServlet
|
||||||
*/
|
*/
|
||||||
public <S extends WebSocket, T extends HttpServlet> T addRestWebSocketServlet(final Class<S> webSocketType, final String prefix, final AnyValue conf) {
|
public <S extends WebSocket, T extends HttpServlet> T addRestWebSocketServlet(final ClassLoader classLoader, final Class<S> webSocketType, final String prefix, final AnyValue conf) {
|
||||||
T servlet = Rest.createRestWebSocketServlet(webSocketType);
|
T servlet = Rest.createRestWebSocketServlet(classLoader, webSocketType);
|
||||||
if (servlet != null) this.prepare.addServlet(servlet, prefix, conf);
|
if (servlet != null) this.prepare.addServlet(servlet, prefix, conf);
|
||||||
return servlet;
|
return servlet;
|
||||||
}
|
}
|
||||||
@@ -189,6 +190,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
*
|
*
|
||||||
* @param <S> Service
|
* @param <S> Service
|
||||||
* @param <T> HttpServlet
|
* @param <T> HttpServlet
|
||||||
|
* @param classLoader ClassLoader
|
||||||
* @param service Service对象
|
* @param service Service对象
|
||||||
* @param userType 用户数据类型
|
* @param userType 用户数据类型
|
||||||
* @param baseServletType RestServlet基类
|
* @param baseServletType RestServlet基类
|
||||||
@@ -196,8 +198,8 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
*
|
*
|
||||||
* @return RestServlet
|
* @return RestServlet
|
||||||
*/
|
*/
|
||||||
public <S extends Service, T extends HttpServlet> T addRestServlet(final S service, final Class userType, final Class<T> baseServletType, final String prefix) {
|
public <S extends Service, T extends HttpServlet> T addRestServlet(final ClassLoader classLoader, final S service, final Class userType, final Class<T> baseServletType, final String prefix) {
|
||||||
return addRestServlet(null, service, userType, baseServletType, prefix);
|
return addRestServlet(classLoader, null, service, userType, baseServletType, prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -205,6 +207,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
*
|
*
|
||||||
* @param <S> Service
|
* @param <S> Service
|
||||||
* @param <T> HttpServlet
|
* @param <T> HttpServlet
|
||||||
|
* @param classLoader ClassLoader
|
||||||
* @param name 资源名
|
* @param name 资源名
|
||||||
* @param service Service对象
|
* @param service Service对象
|
||||||
* @param userType 用户数据类型
|
* @param userType 用户数据类型
|
||||||
@@ -213,7 +216,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
*
|
*
|
||||||
* @return RestServlet
|
* @return RestServlet
|
||||||
*/
|
*/
|
||||||
public <S extends Service, T extends HttpServlet> T addRestServlet(final String name, final S service, final Class userType, final Class<T> baseServletType, final String prefix) {
|
public <S extends Service, T extends HttpServlet> T addRestServlet(final ClassLoader classLoader, final String name, final S service, final Class userType, final Class<T> baseServletType, final String prefix) {
|
||||||
T servlet = null;
|
T servlet = null;
|
||||||
final boolean sncp = Sncp.isSncpDyn(service);
|
final boolean sncp = Sncp.isSncpDyn(service);
|
||||||
final String resname = name == null ? (sncp ? Sncp.getResourceName(service) : "") : name;
|
final String resname = name == null ? (sncp ? Sncp.getResourceName(service) : "") : name;
|
||||||
@@ -233,7 +236,7 @@ public class HttpServer extends Server<String, HttpContext, HttpRequest, HttpRes
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
final boolean first = servlet == null;
|
final boolean first = servlet == null;
|
||||||
if (servlet == null) servlet = Rest.createRestServlet(userType, baseServletType, serviceType);
|
if (servlet == null) servlet = Rest.createRestServlet(classLoader, userType, baseServletType, serviceType);
|
||||||
if (servlet == null) return null; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null
|
if (servlet == null) return null; //没有HttpMapping方法的HttpServlet调用Rest.createRestServlet就会返回null
|
||||||
try { //若提供动态变更Service服务功能,则改Rest服务无法做出相应更新
|
try { //若提供动态变更Service服务功能,则改Rest服务无法做出相应更新
|
||||||
Field field = servlet.getClass().getDeclaredField(Rest.REST_SERVICE_FIELD_NAME);
|
Field field = servlet.getClass().getDeclaredField(Rest.REST_SERVICE_FIELD_NAME);
|
||||||
|
|||||||
@@ -214,7 +214,7 @@ public class HttpServlet extends Servlet<HttpContext, HttpRequest, HttpResponse>
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
try {
|
try {
|
||||||
Class.forName(newDynName.replace('/', '.'));
|
Thread.currentThread().getContextClassLoader().loadClass(newDynName.replace('/', '.'));
|
||||||
newDynName += "_" + (++i);
|
newDynName += "_" + (++i);
|
||||||
} catch (Throwable ex) {
|
} catch (Throwable ex) {
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ public final class Rest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static <T extends HttpServlet> T createRestWebSocketServlet(final Class<? extends WebSocket> webSocketType) {
|
static <T extends HttpServlet> T createRestWebSocketServlet(final ClassLoader classLoader, final Class<? extends WebSocket> webSocketType) {
|
||||||
if (webSocketType == null) throw new RuntimeException("Rest WebSocket Class is null on createRestWebSocketServlet");
|
if (webSocketType == null) throw new RuntimeException("Rest WebSocket Class is null on createRestWebSocketServlet");
|
||||||
if (Modifier.isAbstract(webSocketType.getModifiers())) throw new RuntimeException("Rest WebSocket Class(" + webSocketType + ") cannot abstract on createRestWebSocketServlet");
|
if (Modifier.isAbstract(webSocketType.getModifiers())) throw new RuntimeException("Rest WebSocket Class(" + webSocketType + ") cannot abstract on createRestWebSocketServlet");
|
||||||
if (Modifier.isFinal(webSocketType.getModifiers())) throw new RuntimeException("Rest WebSocket Class(" + webSocketType + ") cannot final on createRestWebSocketServlet");
|
if (Modifier.isFinal(webSocketType.getModifiers())) throw new RuntimeException("Rest WebSocket Class(" + webSocketType + ") cannot final on createRestWebSocketServlet");
|
||||||
@@ -178,6 +178,7 @@ public final class Rest {
|
|||||||
|
|
||||||
//----------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------
|
||||||
final Set<Field> resourcesFieldSet = new LinkedHashSet<>();
|
final Set<Field> resourcesFieldSet = new LinkedHashSet<>();
|
||||||
|
final ClassLoader loader = classLoader == null ? Thread.currentThread().getContextClassLoader() : classLoader;
|
||||||
Class clzz = webSocketType;
|
Class clzz = webSocketType;
|
||||||
do {
|
do {
|
||||||
for (Field field : webSocketType.getDeclaredFields()) {
|
for (Field field : webSocketType.getDeclaredFields()) {
|
||||||
@@ -232,7 +233,6 @@ public final class Rest {
|
|||||||
final String newDynConsumerSimpleName = "_DynRestOnMessageConsumer";
|
final String newDynConsumerSimpleName = "_DynRestOnMessageConsumer";
|
||||||
final String newDynConsumerFullName = newDynName + "$" + newDynConsumerSimpleName;
|
final String newDynConsumerFullName = newDynName + "$" + newDynConsumerSimpleName;
|
||||||
//----------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------
|
||||||
ClassLoader loader = Rest.class.getClassLoader();
|
|
||||||
|
|
||||||
ClassWriter cw = new ClassWriter(COMPUTE_FRAMES);
|
ClassWriter cw = new ClassWriter(COMPUTE_FRAMES);
|
||||||
FieldVisitor fv;
|
FieldVisitor fv;
|
||||||
@@ -530,7 +530,7 @@ public final class Rest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static <T extends HttpServlet> T createRestServlet(final Class userType0, final Class<T> baseServletType, final Class<? extends Service> serviceType) {
|
static <T extends HttpServlet> T createRestServlet(final ClassLoader classLoader, final Class userType0, final Class<T> baseServletType, final Class<? extends Service> serviceType) {
|
||||||
if (baseServletType == null || serviceType == null) throw new RuntimeException(" Servlet or Service is null Class on createRestServlet");
|
if (baseServletType == null || serviceType == null) throw new RuntimeException(" Servlet or Service is null Class on createRestServlet");
|
||||||
if (!HttpServlet.class.isAssignableFrom(baseServletType)) throw new RuntimeException(baseServletType + " is not HttpServlet Class on createRestServlet");
|
if (!HttpServlet.class.isAssignableFrom(baseServletType)) throw new RuntimeException(baseServletType + " is not HttpServlet Class on createRestServlet");
|
||||||
int mod = baseServletType.getModifiers();
|
int mod = baseServletType.getModifiers();
|
||||||
@@ -564,7 +564,7 @@ public final class Rest {
|
|||||||
final String supDynName = baseServletType.getName().replace('.', '/');
|
final String supDynName = baseServletType.getName().replace('.', '/');
|
||||||
final RestService controller = serviceType.getAnnotation(RestService.class);
|
final RestService controller = serviceType.getAnnotation(RestService.class);
|
||||||
if (controller != null && controller.ignore()) throw new RuntimeException(serviceType + " is ignore Rest Service Class"); //标记为ignore=true不创建Servlet
|
if (controller != null && controller.ignore()) throw new RuntimeException(serviceType + " is ignore Rest Service Class"); //标记为ignore=true不创建Servlet
|
||||||
ClassLoader loader = Rest.class.getClassLoader();
|
ClassLoader loader = classLoader == null ? Thread.currentThread().getContextClassLoader() : classLoader;
|
||||||
String newDynName = serviceTypeInternalName.substring(0, serviceTypeInternalName.lastIndexOf('/') + 1) + "_Dyn" + serviceType.getSimpleName().replaceAll("Service.*$", "") + "RestServlet";
|
String newDynName = serviceTypeInternalName.substring(0, serviceTypeInternalName.lastIndexOf('/') + 1) + "_Dyn" + serviceType.getSimpleName().replaceAll("Service.*$", "") + "RestServlet";
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -256,13 +256,14 @@ public abstract class Sncp {
|
|||||||
* 创建Service的本地模式Class
|
* 创建Service的本地模式Class
|
||||||
*
|
*
|
||||||
* @param <T> Service子类
|
* @param <T> Service子类
|
||||||
|
* @param classLoader ClassLoader
|
||||||
* @param name 资源名
|
* @param name 资源名
|
||||||
* @param serviceImplClass Service类
|
* @param serviceImplClass Service类
|
||||||
*
|
*
|
||||||
* @return Service实例
|
* @return Service实例
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
protected static <T extends Service> Class<? extends T> createLocalServiceClass(final String name, final Class<T> serviceImplClass) {
|
protected static <T extends Service> Class<? extends T> createLocalServiceClass(ClassLoader classLoader, final String name, final Class<T> serviceImplClass) {
|
||||||
if (serviceImplClass == null) return null;
|
if (serviceImplClass == null) return null;
|
||||||
if (!Service.class.isAssignableFrom(serviceImplClass)) return serviceImplClass;
|
if (!Service.class.isAssignableFrom(serviceImplClass)) return serviceImplClass;
|
||||||
int mod = serviceImplClass.getModifiers();
|
int mod = serviceImplClass.getModifiers();
|
||||||
@@ -274,7 +275,7 @@ public abstract class Sncp {
|
|||||||
final String clientDesc = Type.getDescriptor(SncpClient.class);
|
final String clientDesc = Type.getDescriptor(SncpClient.class);
|
||||||
final String anyValueDesc = Type.getDescriptor(AnyValue.class);
|
final String anyValueDesc = Type.getDescriptor(AnyValue.class);
|
||||||
final String sncpDynDesc = Type.getDescriptor(SncpDyn.class);
|
final String sncpDynDesc = Type.getDescriptor(SncpDyn.class);
|
||||||
ClassLoader loader = Sncp.class.getClassLoader();
|
ClassLoader loader = classLoader == null ? Thread.currentThread().getContextClassLoader() : classLoader;
|
||||||
String newDynName = supDynName.substring(0, supDynName.lastIndexOf('/') + 1) + LOCALPREFIX + serviceImplClass.getSimpleName();
|
String newDynName = supDynName.substring(0, supDynName.lastIndexOf('/') + 1) + LOCALPREFIX + serviceImplClass.getSimpleName();
|
||||||
if (!name.isEmpty()) {
|
if (!name.isEmpty()) {
|
||||||
boolean normal = true;
|
boolean normal = true;
|
||||||
@@ -285,7 +286,7 @@ public abstract class Sncp {
|
|||||||
newDynName += "_" + (normal ? name : hash(name));
|
newDynName += "_" + (normal ? name : hash(name));
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
return (Class<T>) Class.forName(newDynName.replace('/', '.'));
|
return (Class<T>) loader.loadClass(newDynName.replace('/', '.'));
|
||||||
} catch (Throwable ex) {
|
} catch (Throwable ex) {
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
@@ -738,7 +739,7 @@ public abstract class Sncp {
|
|||||||
|
|
||||||
public static <T extends Service> T createSimpleLocalService(final Class<T> serviceImplClass,
|
public static <T extends Service> T createSimpleLocalService(final Class<T> serviceImplClass,
|
||||||
final TransportFactory transportFactory, final InetSocketAddress clientSncpAddress, final String... groups) {
|
final TransportFactory transportFactory, final InetSocketAddress clientSncpAddress, final String... groups) {
|
||||||
return createLocalService("", serviceImplClass, ResourceFactory.root(), transportFactory, clientSncpAddress, Utility.ofSet(groups), null);
|
return createLocalService(null, "", serviceImplClass, ResourceFactory.root(), transportFactory, clientSncpAddress, Utility.ofSet(groups), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -746,6 +747,7 @@ public abstract class Sncp {
|
|||||||
* 创建本地模式Service实例
|
* 创建本地模式Service实例
|
||||||
*
|
*
|
||||||
* @param <T> Service泛型
|
* @param <T> Service泛型
|
||||||
|
* @param classLoader ClassLoader
|
||||||
* @param name 资源名
|
* @param name 资源名
|
||||||
* @param serviceImplClass Service类
|
* @param serviceImplClass Service类
|
||||||
* @param resourceFactory ResourceFactory
|
* @param resourceFactory ResourceFactory
|
||||||
@@ -758,6 +760,7 @@ public abstract class Sncp {
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public static <T extends Service> T createLocalService(
|
public static <T extends Service> T createLocalService(
|
||||||
|
final ClassLoader classLoader,
|
||||||
final String name,
|
final String name,
|
||||||
final Class<T> serviceImplClass,
|
final Class<T> serviceImplClass,
|
||||||
final ResourceFactory resourceFactory,
|
final ResourceFactory resourceFactory,
|
||||||
@@ -766,7 +769,7 @@ public abstract class Sncp {
|
|||||||
final Set<String> groups,
|
final Set<String> groups,
|
||||||
final AnyValue conf) {
|
final AnyValue conf) {
|
||||||
try {
|
try {
|
||||||
final Class newClazz = createLocalServiceClass(name, serviceImplClass);
|
final Class newClazz = createLocalServiceClass(classLoader, name, serviceImplClass);
|
||||||
T rs = (T) newClazz.newInstance();
|
T rs = (T) newClazz.newInstance();
|
||||||
//--------------------------------------
|
//--------------------------------------
|
||||||
Service remoteService = null;
|
Service remoteService = null;
|
||||||
@@ -780,7 +783,7 @@ public abstract class Sncp {
|
|||||||
if (!field.getType().isAssignableFrom(newClazz)) continue;
|
if (!field.getType().isAssignableFrom(newClazz)) continue;
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
if (remoteService == null && clientSncpAddress != null) {
|
if (remoteService == null && clientSncpAddress != null) {
|
||||||
remoteService = createRemoteService(name, serviceImplClass, transportFactory, clientSncpAddress, groups, conf);
|
remoteService = createRemoteService(classLoader, name, serviceImplClass, transportFactory, clientSncpAddress, groups, conf);
|
||||||
}
|
}
|
||||||
if (remoteService != null) field.set(rs, remoteService);
|
if (remoteService != null) field.set(rs, remoteService);
|
||||||
}
|
}
|
||||||
@@ -821,7 +824,7 @@ public abstract class Sncp {
|
|||||||
|
|
||||||
public static <T extends Service> T createSimpleRemoteService(final Class<T> serviceImplClass,
|
public static <T extends Service> T createSimpleRemoteService(final Class<T> serviceImplClass,
|
||||||
final TransportFactory transportFactory, final InetSocketAddress clientSncpAddress, final String... groups) {
|
final TransportFactory transportFactory, final InetSocketAddress clientSncpAddress, final String... groups) {
|
||||||
return createRemoteService("", serviceImplClass, transportFactory, clientSncpAddress, Utility.ofSet(groups), null);
|
return createRemoteService(null, "", serviceImplClass, transportFactory, clientSncpAddress, Utility.ofSet(groups), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -865,6 +868,7 @@ public abstract class Sncp {
|
|||||||
* 创建远程模式的Service实例
|
* 创建远程模式的Service实例
|
||||||
*
|
*
|
||||||
* @param <T> Service泛型
|
* @param <T> Service泛型
|
||||||
|
* @param classLoader ClassLoader
|
||||||
* @param name 资源名
|
* @param name 资源名
|
||||||
* @param serviceTypeOrImplClass Service类
|
* @param serviceTypeOrImplClass Service类
|
||||||
* @param transportFactory TransportFactory
|
* @param transportFactory TransportFactory
|
||||||
@@ -877,6 +881,7 @@ public abstract class Sncp {
|
|||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
|
||||||
public static <T extends Service> T createRemoteService(
|
public static <T extends Service> T createRemoteService(
|
||||||
|
final ClassLoader classLoader,
|
||||||
final String name,
|
final String name,
|
||||||
final Class<T> serviceTypeOrImplClass,
|
final Class<T> serviceTypeOrImplClass,
|
||||||
final TransportFactory transportFactory,
|
final TransportFactory transportFactory,
|
||||||
@@ -893,12 +898,12 @@ public abstract class Sncp {
|
|||||||
final String clientDesc = Type.getDescriptor(SncpClient.class);
|
final String clientDesc = Type.getDescriptor(SncpClient.class);
|
||||||
final String sncpDynDesc = Type.getDescriptor(SncpDyn.class);
|
final String sncpDynDesc = Type.getDescriptor(SncpDyn.class);
|
||||||
final String anyValueDesc = Type.getDescriptor(AnyValue.class);
|
final String anyValueDesc = Type.getDescriptor(AnyValue.class);
|
||||||
ClassLoader loader = Sncp.class.getClassLoader();
|
ClassLoader loader = classLoader == null ? Thread.currentThread().getContextClassLoader() : classLoader;
|
||||||
String newDynName = supDynName.substring(0, supDynName.lastIndexOf('/') + 1) + REMOTEPREFIX + serviceTypeOrImplClass.getSimpleName();
|
String newDynName = supDynName.substring(0, supDynName.lastIndexOf('/') + 1) + REMOTEPREFIX + serviceTypeOrImplClass.getSimpleName();
|
||||||
try {
|
try {
|
||||||
Class newClazz = Class.forName(newDynName.replace('/', '.'));
|
Class newClazz = loader.loadClass(newDynName.replace('/', '.'));
|
||||||
T rs = (T) newClazz.newInstance();
|
T rs = (T) newClazz.newInstance();
|
||||||
SncpClient client = new SncpClient(name, serviceTypeOrImplClass, rs, transportFactory, true, realed ? createLocalServiceClass(name, serviceTypeOrImplClass) : serviceTypeOrImplClass, clientAddress);
|
SncpClient client = new SncpClient(name, serviceTypeOrImplClass, rs, transportFactory, true, realed ? createLocalServiceClass(loader, name, serviceTypeOrImplClass) : serviceTypeOrImplClass, clientAddress);
|
||||||
client.setRemoteGroups(groups);
|
client.setRemoteGroups(groups);
|
||||||
client.setRemoteGroupTransport(transportFactory.loadRemoteTransport(clientAddress, groups));
|
client.setRemoteGroupTransport(transportFactory.loadRemoteTransport(clientAddress, groups));
|
||||||
Field c = newClazz.getDeclaredField(FIELDPREFIX + "_client");
|
Field c = newClazz.getDeclaredField(FIELDPREFIX + "_client");
|
||||||
@@ -987,7 +992,7 @@ public abstract class Sncp {
|
|||||||
mv.visitEnd();
|
mv.visitEnd();
|
||||||
}
|
}
|
||||||
int i = -1;
|
int i = -1;
|
||||||
for (final SncpAction entry : SncpClient.getSncpActions(realed ? createLocalServiceClass(name, serviceTypeOrImplClass) : serviceTypeOrImplClass)) {
|
for (final SncpAction entry : SncpClient.getSncpActions(realed ? createLocalServiceClass(loader, name, serviceTypeOrImplClass) : serviceTypeOrImplClass)) {
|
||||||
final int index = ++i;
|
final int index = ++i;
|
||||||
final java.lang.reflect.Method method = entry.method;
|
final java.lang.reflect.Method method = entry.method;
|
||||||
{
|
{
|
||||||
@@ -1091,7 +1096,7 @@ public abstract class Sncp {
|
|||||||
}.loadClass(newDynName.replace('/', '.'), bytes);
|
}.loadClass(newDynName.replace('/', '.'), bytes);
|
||||||
try {
|
try {
|
||||||
T rs = (T) newClazz.newInstance();
|
T rs = (T) newClazz.newInstance();
|
||||||
SncpClient client = new SncpClient(name, serviceTypeOrImplClass, rs, transportFactory, true, realed ? createLocalServiceClass(name, serviceTypeOrImplClass) : serviceTypeOrImplClass, clientAddress);
|
SncpClient client = new SncpClient(name, serviceTypeOrImplClass, rs, transportFactory, true, realed ? createLocalServiceClass(loader, name, serviceTypeOrImplClass) : serviceTypeOrImplClass, clientAddress);
|
||||||
client.setRemoteGroups(groups);
|
client.setRemoteGroups(groups);
|
||||||
client.setRemoteGroupTransport(transportFactory.loadRemoteTransport(clientAddress, groups));
|
client.setRemoteGroupTransport(transportFactory.loadRemoteTransport(clientAddress, groups));
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ public final class SncpDynServlet extends SncpServlet {
|
|||||||
+ "DynAction" + serviceClass.getSimpleName() + "_" + method.getName() + "_" + actionid;
|
+ "DynAction" + serviceClass.getSimpleName() + "_" + method.getName() + "_" + actionid;
|
||||||
while (true) {
|
while (true) {
|
||||||
try {
|
try {
|
||||||
Class.forName(newDynName.replace('/', '.'));
|
Thread.currentThread().getContextClassLoader().loadClass(newDynName.replace('/', '.'));
|
||||||
newDynName += "_";
|
newDynName += "_";
|
||||||
} catch (Throwable ex) {
|
} catch (Throwable ex) {
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
String storeValueStr = prop.getValue("value-type");
|
String storeValueStr = prop.getValue("value-type");
|
||||||
if (storeKeyStr != null && storeValueStr != null) {
|
if (storeKeyStr != null && storeValueStr != null) {
|
||||||
try {
|
try {
|
||||||
this.setStoreType(Class.forName(storeKeyStr), Class.forName(storeValueStr));
|
this.setStoreType(Thread.currentThread().getContextClassLoader().loadClass(storeKeyStr), Thread.currentThread().getContextClassLoader().loadClass(storeValueStr));
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
logger.log(Level.SEVERE, self.getClass().getSimpleName() + " load key & value store class (" + storeKeyStr + ", " + storeValueStr + ") error", e);
|
logger.log(Level.SEVERE, self.getClass().getSimpleName() + " load key & value store class (" + storeKeyStr + ", " + storeValueStr + ") error", e);
|
||||||
}
|
}
|
||||||
@@ -94,7 +94,7 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
String expireHandlerClass = prop == null ? null : prop.getValue("expirehandler");
|
String expireHandlerClass = prop == null ? null : prop.getValue("expirehandler");
|
||||||
if (expireHandlerClass != null) {
|
if (expireHandlerClass != null) {
|
||||||
try {
|
try {
|
||||||
this.expireHandler = (Consumer<CacheEntry>) Class.forName(expireHandlerClass).newInstance();
|
this.expireHandler = (Consumer<CacheEntry>) Thread.currentThread().getContextClassLoader().loadClass(expireHandlerClass).newInstance();
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
logger.log(Level.SEVERE, self.getClass().getSimpleName() + " new expirehandler class (" + expireHandlerClass + ") instance error", e);
|
logger.log(Level.SEVERE, self.getClass().getSimpleName() + " new expirehandler class (" + expireHandlerClass + ") instance error", e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ public final class DataSources {
|
|||||||
String impl = readprop.getProperty(JDBC_DATASOURCE_CLASS, DataJdbcSource.class.getName());
|
String impl = readprop.getProperty(JDBC_DATASOURCE_CLASS, DataJdbcSource.class.getName());
|
||||||
if (DataJdbcSource.class.getName().equals(impl)) return new DataJdbcSource(unitName, readprop, writeprop);
|
if (DataJdbcSource.class.getName().equals(impl)) return new DataJdbcSource(unitName, readprop, writeprop);
|
||||||
try {
|
try {
|
||||||
Class ds = Class.forName(impl);
|
Class ds = Thread.currentThread().getContextClassLoader().loadClass(impl);
|
||||||
for (Constructor d : ds.getConstructors()) {
|
for (Constructor d : ds.getConstructors()) {
|
||||||
Class<?>[] paramtypes = d.getParameterTypes();
|
Class<?>[] paramtypes = d.getParameterTypes();
|
||||||
if (paramtypes.length == 1 && paramtypes[0] == Properties.class) {
|
if (paramtypes.length == 1 && paramtypes[0] == Properties.class) {
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ public class PoolJdbcSource {
|
|||||||
case "com.mysql.cj.jdbc.Driver":
|
case "com.mysql.cj.jdbc.Driver":
|
||||||
case "com.mysql.jdbc.Driver":
|
case "com.mysql.jdbc.Driver":
|
||||||
try {
|
try {
|
||||||
Class.forName("com.mysql.cj.jdbc.MysqlConnectionPoolDataSource");
|
Thread.currentThread().getContextClassLoader().loadClass("com.mysql.cj.jdbc.MysqlConnectionPoolDataSource");
|
||||||
source = "com.mysql.cj.jdbc.MysqlConnectionPoolDataSource";
|
source = "com.mysql.cj.jdbc.MysqlConnectionPoolDataSource";
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
source = "com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource";
|
source = "com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource";
|
||||||
@@ -146,10 +146,10 @@ public class PoolJdbcSource {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final Class clazz = Class.forName(source);
|
final Class clazz = Thread.currentThread().getContextClassLoader().loadClass(source);
|
||||||
Object pdsource = clazz.newInstance();
|
Object pdsource = clazz.newInstance();
|
||||||
if (source.contains(".postgresql.")) {
|
if (source.contains(".postgresql.")) {
|
||||||
Class driver = Class.forName("org.postgresql.Driver");
|
Class driver = Thread.currentThread().getContextClassLoader().loadClass("org.postgresql.Driver");
|
||||||
Properties properties = (Properties) driver.getMethod("parseURL", String.class, Properties.class).invoke(null, url, new Properties());
|
Properties properties = (Properties) driver.getMethod("parseURL", String.class, Properties.class).invoke(null, url, new Properties());
|
||||||
clazz.getMethod("setServerName", String.class).invoke(pdsource, properties.getProperty("PGHOST"));
|
clazz.getMethod("setServerName", String.class).invoke(pdsource, properties.getProperty("PGHOST"));
|
||||||
clazz.getMethod("setDatabaseName", String.class).invoke(pdsource, properties.getProperty("PGDBNAME"));
|
clazz.getMethod("setDatabaseName", String.class).invoke(pdsource, properties.getProperty("PGDBNAME"));
|
||||||
|
|||||||
@@ -431,7 +431,7 @@ public interface Attribute<T, F> {
|
|||||||
final String interDesc = Type.getDescriptor(clazz);
|
final String interDesc = Type.getDescriptor(clazz);
|
||||||
final String columnDesc = Type.getDescriptor(column);
|
final String columnDesc = Type.getDescriptor(column);
|
||||||
|
|
||||||
ClassLoader loader = Attribute.class.getClassLoader();
|
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
||||||
String newDynName = supDynName + "_Dyn_" + clazz.getSimpleName() + "_"
|
String newDynName = supDynName + "_Dyn_" + clazz.getSimpleName() + "_"
|
||||||
+ fieldname.substring(fieldname.indexOf('.') + 1) + "_" + pcolumn.getSimpleName().replace("[]", "Array");
|
+ fieldname.substring(fieldname.indexOf('.') + 1) + "_" + pcolumn.getSimpleName().replace("[]", "Array");
|
||||||
if (String.class.getClassLoader() != clazz.getClassLoader()) {
|
if (String.class.getClassLoader() != clazz.getClassLoader()) {
|
||||||
@@ -440,7 +440,7 @@ public interface Attribute<T, F> {
|
|||||||
+ fieldname.substring(fieldname.indexOf('.') + 1) + "_" + pcolumn.getSimpleName().replace("[]", "Array");
|
+ fieldname.substring(fieldname.indexOf('.') + 1) + "_" + pcolumn.getSimpleName().replace("[]", "Array");
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
return (Attribute) Class.forName(newDynName.replace('/', '.')).newInstance();
|
return (Attribute) loader.loadClass(newDynName.replace('/', '.')).newInstance();
|
||||||
} catch (Throwable ex) {
|
} catch (Throwable ex) {
|
||||||
}
|
}
|
||||||
//---------------------------------------------------
|
//---------------------------------------------------
|
||||||
|
|||||||
@@ -214,14 +214,14 @@ public interface Creator<T> {
|
|||||||
final String supDynName = Creator.class.getName().replace('.', '/');
|
final String supDynName = Creator.class.getName().replace('.', '/');
|
||||||
final String interName = clazz.getName().replace('.', '/');
|
final String interName = clazz.getName().replace('.', '/');
|
||||||
final String interDesc = Type.getDescriptor(clazz);
|
final String interDesc = Type.getDescriptor(clazz);
|
||||||
ClassLoader loader = Creator.class.getClassLoader();
|
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
||||||
String newDynName = supDynName + "_" + clazz.getSimpleName() + "_" + (System.currentTimeMillis() % 10000);
|
String newDynName = supDynName + "_" + clazz.getSimpleName() + "_" + (System.currentTimeMillis() % 10000);
|
||||||
if (String.class.getClassLoader() != clazz.getClassLoader()) {
|
if (String.class.getClassLoader() != clazz.getClassLoader()) {
|
||||||
loader = clazz.getClassLoader();
|
loader = clazz.getClassLoader();
|
||||||
newDynName = interName + "_Dyn" + Creator.class.getSimpleName();
|
newDynName = interName + "_Dyn" + Creator.class.getSimpleName();
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
return (Creator) Class.forName(newDynName.replace('/', '.')).newInstance();
|
return (Creator) loader.loadClass(newDynName.replace('/', '.')).newInstance();
|
||||||
} catch (Throwable ex) {
|
} catch (Throwable ex) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,13 +35,13 @@ public interface Reproduce<D, S> extends BiFunction<D, S, D> {
|
|||||||
final String destDesc = Type.getDescriptor(destClass);
|
final String destDesc = Type.getDescriptor(destClass);
|
||||||
final String srcDesc = Type.getDescriptor(srcClass);
|
final String srcDesc = Type.getDescriptor(srcClass);
|
||||||
String newDynName = supDynName + "Dyn_" + destClass.getSimpleName() + "_" + srcClass.getSimpleName();
|
String newDynName = supDynName + "Dyn_" + destClass.getSimpleName() + "_" + srcClass.getSimpleName();
|
||||||
ClassLoader loader = Reproduce.class.getClassLoader();
|
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
||||||
if (String.class.getClassLoader() != destClass.getClassLoader()) {
|
if (String.class.getClassLoader() != destClass.getClassLoader()) {
|
||||||
loader = destClass.getClassLoader();
|
loader = destClass.getClassLoader();
|
||||||
newDynName = destName + "_Dyn" + Reproduce.class.getSimpleName() + "_" + srcClass.getSimpleName();
|
newDynName = destName + "_Dyn" + Reproduce.class.getSimpleName() + "_" + srcClass.getSimpleName();
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
return (Reproduce) Class.forName(newDynName.replace('/', '.')).newInstance();
|
return (Reproduce) loader.loadClass(newDynName.replace('/', '.')).newInstance();
|
||||||
} catch (Throwable ex) {
|
} catch (Throwable ex) {
|
||||||
}
|
}
|
||||||
// ------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -177,11 +177,11 @@ public abstract class TypeToken<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static Type createParameterizedType(final Class rawType, final Type... actualTypeArguments) {
|
private static Type createParameterizedType(final Class rawType, final Type... actualTypeArguments) {
|
||||||
ClassLoader loader = TypeToken.class.getClassLoader();
|
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
||||||
String newDynName = TypeToken.class.getName().replace('.', '/') + "_Dyn" + System.currentTimeMillis();
|
String newDynName = TypeToken.class.getName().replace('.', '/') + "_Dyn" + System.currentTimeMillis();
|
||||||
for (;;) {
|
for (;;) {
|
||||||
try {
|
try {
|
||||||
Class.forName(newDynName.replace('/', '.'));
|
loader.loadClass(newDynName.replace('/', '.'));
|
||||||
newDynName = TypeToken.class.getName().replace('.', '/') + "_Dyn" + Math.abs(System.nanoTime());
|
newDynName = TypeToken.class.getName().replace('.', '/') + "_Dyn" + Math.abs(System.nanoTime());
|
||||||
} catch (Throwable ex) { //异常说明类不存在
|
} catch (Throwable ex) { //异常说明类不存在
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user