This commit is contained in:
wentch
2016-01-15 09:38:58 +08:00
parent 02a2a91737
commit 14b13f0c69
3 changed files with 25 additions and 19 deletions

View File

@@ -70,8 +70,8 @@ public final class NodeHttpServer extends NodeServer {
final ResourceFactory regFactory = application.getResourceFactory(); final ResourceFactory regFactory = application.getResourceFactory();
factory.add(WebSocketNode.class, (ResourceFactory rf, final Object src, final String resourceName, Field field, Object attachment) -> { //主要用于单点的服务 factory.add(WebSocketNode.class, (ResourceFactory rf, final Object src, final String resourceName, Field field, Object attachment) -> { //主要用于单点的服务
try { try {
if (field.getAnnotation(Resource.class) == null) return; if (field.getAnnotation(Resource.class) == null) return null;
if (!(src instanceof WebSocketServlet)) return; if (!(src instanceof WebSocketServlet)) return null;
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) {
@@ -81,9 +81,11 @@ public final class NodeHttpServer extends NodeServer {
logger.fine("[" + Thread.currentThread().getName() + "] Load Service " + nodeService); logger.fine("[" + Thread.currentThread().getName() + "] Load Service " + nodeService);
} }
field.set(src, nodeService); field.set(src, nodeService);
return nodeService;
} }
} catch (Exception e) { } catch (Exception e) {
logger.log(Level.SEVERE, "WebSocketNode inject error", e); logger.log(Level.SEVERE, "WebSocketNode inject error", e);
return null;
} }
}); });
} }

View File

@@ -158,8 +158,8 @@ public abstract class NodeServer {
final ResourceFactory regFactory = application.getResourceFactory(); final ResourceFactory regFactory = application.getResourceFactory();
factory.add(DataSource.class, (ResourceFactory rf, final Object src, String resourceName, Field field, final Object attachment) -> { factory.add(DataSource.class, (ResourceFactory rf, final Object src, String resourceName, Field field, final Object attachment) -> {
try { try {
if (field.getAnnotation(Resource.class) == null) return; if (field.getAnnotation(Resource.class) == null) return null;
if ((src instanceof Service) && Sncp.isRemote((Service) src)) return; //远程模式不得注入 DataSource if ((src instanceof Service) && Sncp.isRemote((Service) src)) return null; //远程模式不得注入 DataSource
DataSource source = new DataDefaultSource(resourceName); DataSource source = new DataDefaultSource(resourceName);
application.dataSources.add(source); application.dataSources.add(source);
regFactory.register(resourceName, DataSource.class, source); regFactory.register(resourceName, DataSource.class, source);
@@ -195,15 +195,17 @@ public abstract class NodeServer {
if (fine) logger.fine("[" + Thread.currentThread().getName() + "] Load Service " + wrapper.getService()); if (fine) logger.fine("[" + Thread.currentThread().getName() + "] Load Service " + wrapper.getService());
} }
field.set(src, source); field.set(src, source);
rf.inject(source, self); // 给 "datasource.nodeid" 赋值 rf.inject(source, self); // 给 "datasource.nodeid" 赋值;
return source;
} catch (Exception e) { } catch (Exception e) {
logger.log(Level.SEVERE, "DataSource inject error", e); logger.log(Level.SEVERE, "DataSource inject error", e);
return null;
} }
}); });
factory.add(CacheSource.class, (ResourceFactory rf, final Object src, final String resourceName, Field field, final Object attachment) -> { factory.add(CacheSource.class, (ResourceFactory rf, final Object src, final String resourceName, Field field, final Object attachment) -> {
try { try {
if (field.getAnnotation(Resource.class) == null) return; if (field.getAnnotation(Resource.class) == null) return null;
if ((src instanceof Service) && Sncp.isRemote((Service) src)) return; //远程模式不得注入 CacheSource if ((src instanceof Service) && Sncp.isRemote((Service) src)) return null; //远程模式不得注入 CacheSource
SncpClient client = null; SncpClient client = null;
Transport sameGroupTransport = null; Transport sameGroupTransport = null;
@@ -244,8 +246,10 @@ public abstract class NodeServer {
if (finer) logger.finer("[" + Thread.currentThread().getName() + "] Load Service " + wrapper.getService()); if (finer) logger.finer("[" + Thread.currentThread().getName() + "] Load Service " + wrapper.getService());
} }
logger.finer("[" + Thread.currentThread().getName() + "] Load Source " + source); logger.finer("[" + Thread.currentThread().getName() + "] Load Source " + source);
return source;
} catch (Exception e) { } catch (Exception e) {
logger.log(Level.SEVERE, "DataSource inject error", e); logger.log(Level.SEVERE, "DataSource inject error", e);
return null;
} }
}); });
} }

View File

@@ -31,7 +31,7 @@ public final class ResourceFactory {
private static final ResourceFactory instance = new ResourceFactory(null); private static final ResourceFactory instance = new ResourceFactory(null);
private final ConcurrentHashMap<Type, ResourceHandler> interceptmap = new ConcurrentHashMap(); private final ConcurrentHashMap<Type, ResourceLoader> loadermap = new ConcurrentHashMap();
private final ConcurrentHashMap<Class<?>, ConcurrentHashMap<String, ?>> store = new ConcurrentHashMap(); private final ConcurrentHashMap<Class<?>, ConcurrentHashMap<String, ?>> store = new ConcurrentHashMap();
@@ -61,9 +61,9 @@ public final class ResourceFactory {
if (rs != null) register("", rs.getClass(), rs); if (rs != null) register("", rs.getClass(), rs);
} }
public void add(final Type clazz, final ResourceHandler rs) { public void add(final Type clazz, final ResourceLoader rs) {
if (clazz == null || rs == null) return; if (clazz == null || rs == null) return;
interceptmap.put(clazz, rs); loadermap.put(clazz, rs);
} }
public void register(final String name, final Object rs) { public void register(final String name, final Object rs) {
@@ -218,10 +218,10 @@ public final class ResourceFactory {
} }
} }
if (rs == null) { if (rs == null) {
ResourceHandler it = findHandler(field.getGenericType(), field); ResourceLoader it = findLoader(field.getGenericType(), field);
if (it != null) it.execute(this, src, rcname, field, attachment); rs = it.load(this, src, rcname, field, attachment);
continue;
} }
if (rs == null) continue;
if (!rs.getClass().isPrimitive() && classtype.isPrimitive()) { if (!rs.getClass().isPrimitive() && classtype.isPrimitive()) {
if (classtype == int.class) { if (classtype == int.class) {
rs = Integer.decode(rs.toString()); rs = Integer.decode(rs.toString());
@@ -249,21 +249,21 @@ public final class ResourceFactory {
} }
} }
private ResourceHandler findHandler(Type ft, Field field) { private ResourceLoader findLoader(Type ft, Field field) {
ResourceHandler it = this.interceptmap.get(ft); ResourceLoader it = this.loadermap.get(ft);
if (it != null) return it; if (it != null) return it;
Class c = field.getType(); Class c = field.getType();
for (Map.Entry<Type, ResourceHandler> en : this.interceptmap.entrySet()) { for (Map.Entry<Type, ResourceLoader> en : this.loadermap.entrySet()) {
Type t = en.getKey(); Type t = en.getKey();
if (t == ft) return en.getValue(); if (t == ft) return en.getValue();
if (t instanceof Class && (((Class) t)).isAssignableFrom(c)) return en.getValue(); if (t instanceof Class && (((Class) t)).isAssignableFrom(c)) return en.getValue();
} }
return parent == null ? null : parent.findHandler(ft, field); return parent == null ? null : parent.findLoader(ft, field);
} }
public static interface ResourceHandler { public static interface ResourceLoader {
public void execute(ResourceFactory factory, Object src, String resourceName, Field field, Object attachment); public Object load(ResourceFactory factory, Object src, String resourceName, Field field, Object attachment);
} }
} }