Application加锁cacheSources

This commit is contained in:
Redkale
2022-12-28 17:07:19 +08:00
parent 34023f6d08
commit b8b8873eaf

View File

@@ -1076,7 +1076,9 @@ public final class Application {
//------------------------------------ 注册 java.net.http.HttpClient ------------------------------------ //------------------------------------ 注册 java.net.http.HttpClient ------------------------------------
resourceFactory.register((ResourceFactory rf, String srcResourceName, final Object srcObj, String resourceName, Field field, final Object attachment) -> { resourceFactory.register((ResourceFactory rf, String srcResourceName, final Object srcObj, String resourceName, Field field, final Object attachment) -> {
try { try {
if (field.getAnnotation(Resource.class) == null && field.getAnnotation(javax.annotation.Resource.class) == null) return null; if (field.getAnnotation(Resource.class) == null && field.getAnnotation(javax.annotation.Resource.class) == null) {
return null;
}
java.net.http.HttpClient.Builder builder = java.net.http.HttpClient.newBuilder(); java.net.http.HttpClient.Builder builder = java.net.http.HttpClient.newBuilder();
if (resourceName.endsWith(".1.1")) { if (resourceName.endsWith(".1.1")) {
builder.version(HttpClient.Version.HTTP_1_1); builder.version(HttpClient.Version.HTTP_1_1);
@@ -1096,7 +1098,9 @@ public final class Application {
//------------------------------------ 注册 HttpSimpleClient ------------------------------------ //------------------------------------ 注册 HttpSimpleClient ------------------------------------
resourceFactory.register((ResourceFactory rf, String srcResourceName, final Object srcObj, String resourceName, Field field, final Object attachment) -> { resourceFactory.register((ResourceFactory rf, String srcResourceName, final Object srcObj, String resourceName, Field field, final Object attachment) -> {
try { try {
if (field.getAnnotation(Resource.class) == null && field.getAnnotation(javax.annotation.Resource.class) == null) return null; if (field.getAnnotation(Resource.class) == null && field.getAnnotation(javax.annotation.Resource.class) == null) {
return null;
}
HttpSimpleClient httpClient = HttpSimpleClient.create(clientAsyncGroup); HttpSimpleClient httpClient = HttpSimpleClient.create(clientAsyncGroup);
field.set(srcObj, httpClient); field.set(srcObj, httpClient);
rf.inject(resourceName, httpClient, null); // 给其可能包含@Resource的字段赋值; rf.inject(resourceName, httpClient, null); // 给其可能包含@Resource的字段赋值;
@@ -1139,7 +1143,9 @@ public final class Application {
//------------------------------------ 注册 HttpMessageClient ------------------------------------ //------------------------------------ 注册 HttpMessageClient ------------------------------------
resourceFactory.register((ResourceFactory rf, String srcResourceName, final Object srcObj, String resourceName, Field field, final Object attachment) -> { resourceFactory.register((ResourceFactory rf, String srcResourceName, final Object srcObj, String resourceName, Field field, final Object attachment) -> {
try { try {
if (field.getAnnotation(Resource.class) == null && field.getAnnotation(javax.annotation.Resource.class) == null) return null; if (field.getAnnotation(Resource.class) == null && field.getAnnotation(javax.annotation.Resource.class) == null) {
return null;
}
if (clusterAgent == null) { if (clusterAgent == null) {
HttpMessageClient messageClient = new HttpMessageLocalClient(application, resourceName); HttpMessageClient messageClient = new HttpMessageLocalClient(application, resourceName);
field.set(srcObj, messageClient); field.set(srcObj, messageClient);
@@ -1185,65 +1191,69 @@ public final class Application {
} }
CacheSource loadCacheSource(final String sourceName, boolean autoMemory) { CacheSource loadCacheSource(final String sourceName, boolean autoMemory) {
long st = System.currentTimeMillis(); synchronized (cacheSources) {
CacheSource old = resourceFactory.find(sourceName, CacheSource.class); long st = System.currentTimeMillis();
if (old != null) return old; CacheSource old = resourceFactory.find(sourceName, CacheSource.class);
final AnyValue sourceConf = findSourceConfig(sourceName, "cachesource"); if (old != null) return old;
if (sourceConf == null) { final AnyValue sourceConf = findSourceConfig(sourceName, "cachesource");
if (!autoMemory) return null; if (sourceConf == null) {
CacheSource source = new CacheMemorySource(sourceName); if (!autoMemory) return null;
cacheSources.add(source); CacheSource source = new CacheMemorySource(sourceName);
resourceFactory.register(sourceName, CacheSource.class, source); cacheSources.add(source);
if (!compileMode && source instanceof Service) ((Service) source).init(sourceConf); resourceFactory.register(sourceName, CacheSource.class, source);
logger.info("Load CacheSource resourceName = " + sourceName + ", source = " + source + " in " + (System.currentTimeMillis() - st) + " ms"); if (!compileMode && source instanceof Service) ((Service) source).init(sourceConf);
return source; logger.info("Load CacheSource resourceName = " + sourceName + ", source = " + source + " in " + (System.currentTimeMillis() - st) + " ms");
return source;
}
try {
CacheSource source = AbstractCacheSource.createCacheSource(serverClassLoader, resourceFactory, sourceConf, sourceName, compileMode);
cacheSources.add(source);
resourceFactory.register(sourceName, CacheSource.class, source);
logger.info("Load CacheSource resourceName = " + sourceName + ", source = " + source + " in " + (System.currentTimeMillis() - st) + " ms");
return source;
} catch (RuntimeException ex) {
throw ex;
} catch (Exception e) {
logger.log(Level.SEVERE, "load application CaheSource error: " + sourceConf, e);
}
return null;
} }
try {
CacheSource source = AbstractCacheSource.createCacheSource(serverClassLoader, resourceFactory, sourceConf, sourceName, compileMode);
cacheSources.add(source);
resourceFactory.register(sourceName, source);
logger.info("Load CacheSource resourceName = " + sourceName + ", source = " + source + " in " + (System.currentTimeMillis() - st) + " ms");
return source;
} catch (RuntimeException ex) {
throw ex;
} catch (Exception e) {
logger.log(Level.SEVERE, "load application CaheSource error: " + sourceConf, e);
}
return null;
} }
DataSource loadDataSource(final String sourceName, boolean autoMemory) { DataSource loadDataSource(final String sourceName, boolean autoMemory) {
DataSource old = resourceFactory.find(sourceName, DataSource.class); synchronized (dataSources) {
if (old != null) return old; DataSource old = resourceFactory.find(sourceName, DataSource.class);
final AnyValue sourceConf = findSourceConfig(sourceName, "datasource"); if (old != null) return old;
if (sourceConf == null) { final AnyValue sourceConf = findSourceConfig(sourceName, "datasource");
if (!autoMemory) return null; if (sourceConf == null) {
DataSource source = new DataMemorySource(sourceName); if (!autoMemory) return null;
if (!compileMode && source instanceof Service) { DataSource source = new DataMemorySource(sourceName);
resourceFactory.inject(sourceName, source); if (!compileMode && source instanceof Service) {
((Service) source).init(sourceConf); resourceFactory.inject(sourceName, source);
((Service) source).init(sourceConf);
}
dataSources.add(source);
resourceFactory.register(sourceName, DataSource.class, source);
logger.info("Load DataSource resourceName = " + sourceName + ", source = " + source);
return source;
} }
dataSources.add(source); try {
resourceFactory.register(sourceName, DataSource.class, source); DataSource source = AbstractDataSource.createDataSource(serverClassLoader, resourceFactory, sourceConf, sourceName, compileMode);
logger.info("Load DataSource resourceName = " + sourceName + ", source = " + source); dataSources.add(source);
return source; if (source instanceof DataMemorySource && DataMemorySource.isSearchType(sourceConf)) {
} resourceFactory.register(sourceName, SearchSource.class, source);
try { } else {
DataSource source = AbstractDataSource.createDataSource(serverClassLoader, resourceFactory, sourceConf, sourceName, compileMode); resourceFactory.register(sourceName, DataSource.class, source);
dataSources.add(source); }
if (source instanceof DataMemorySource && DataMemorySource.isSearchType(sourceConf)) { logger.info("Load DataSource resourceName = " + sourceName + ", source = " + source);
resourceFactory.register(sourceName, SearchSource.class, source); return source;
} else { } catch (RuntimeException ex) {
resourceFactory.register(sourceName, source); throw ex;
} catch (Exception e) {
logger.log(Level.SEVERE, "load application DataSource error: " + sourceConf, e);
} }
logger.info("Load DataSource resourceName = " + sourceName + ", source = " + source); return null;
return source;
} catch (RuntimeException ex) {
throw ex;
} catch (Exception e) {
logger.log(Level.SEVERE, "load application DataSource error: " + sourceConf, e);
} }
return null;
} }
private void initResources() throws Exception { private void initResources() throws Exception {