diff --git a/src/main/java/META-INF/application-template.xml b/src/main/java/META-INF/application-template.xml index a260c57bc..d20e61c8c 100644 --- a/src/main/java/META-INF/application-template.xml +++ b/src/main/java/META-INF/application-template.xml @@ -124,8 +124,8 @@ 如果name是system.property.开头的值将会在进程启动时进行System.setProperty("yyyy", "YYYYYY")操作。 如果name是mimetype.property.开头的值将会在进程启动时进行MimeType.add("yyyy", "YYYYYY")操作。 先加载子节点property,再加载load文件, 最后加载agent的实现子类。 - agent: 实现类名,必须是org.redkale.boot.PropertiesAgent的子类 load: 加载文件,多个用;隔开。 + 其他属性: 供org.redkale.boot.PropertiesAgentProvider使用判断 默认置入的system.property.的有: System.setProperty("redkale.net.transport.poolmaxconns", "100"); System.setProperty("redkale.net.transport.pinginterval", "30"); @@ -138,7 +138,7 @@ 节点下也可包含非节点. 非其节点可以通过@Resource(name="properties.xxxxxx")进行注入, 被注解的字段类型只能是AnyValue、AnyValue[] --> - + diff --git a/src/main/java/org/redkale/boot/Application.java b/src/main/java/org/redkale/boot/Application.java index 67359a25a..504fcf93f 100644 --- a/src/main/java/org/redkale/boot/Application.java +++ b/src/main/java/org/redkale/boot/Application.java @@ -494,11 +494,10 @@ public final class Application { Iterator it = ServiceLoader.load(ClusterAgentProvider.class, classLoader).iterator(); RedkaleClassLoader.putServiceLoader(ClusterAgentProvider.class); while (it.hasNext()) { - ClusterAgentProvider agent = it.next(); - if (agent != null) RedkaleClassLoader.putReflectionPublicConstructors(agent.getClass(), agent.getClass().getName()); //loader class - if (agent != null && agent.acceptsConf(clusterConf)) { - RedkaleClassLoader.putReflectionPublicConstructors(agent.getClass(), agent.agentClass().getName()); //agent class - cluster = agent.agentClass().getConstructor().newInstance(); + ClusterAgentProvider provider = it.next(); + if (provider != null) RedkaleClassLoader.putReflectionPublicConstructors(provider.getClass(), provider.getClass().getName()); //loader class + if (provider != null && provider.acceptsConf(clusterConf)) { + cluster = provider.createInstance(); cluster.setConfig(clusterConf); break; } @@ -550,11 +549,10 @@ public final class Application { Iterator it = ServiceLoader.load(MessageAgentProvider.class, classLoader).iterator(); RedkaleClassLoader.putServiceLoader(MessageAgentProvider.class); while (it.hasNext()) { - MessageAgentProvider messageAgent = it.next(); - if (messageAgent != null) RedkaleClassLoader.putReflectionPublicConstructors(messageAgent.getClass(), messageAgent.getClass().getName()); //loader class - if (messageAgent != null && messageAgent.acceptsConf(mqConf)) { - RedkaleClassLoader.putReflectionPublicConstructors(messageAgent.getClass(), messageAgent.agentClass().getName()); //agent class - mqs[i] = messageAgent.agentClass().getConstructor().newInstance(); + MessageAgentProvider provider = it.next(); + if (provider != null) RedkaleClassLoader.putReflectionPublicConstructors(provider.getClass(), provider.getClass().getName()); //loader class + if (provider != null && provider.acceptsConf(mqConf)) { + mqs[i] = provider.createInstance(); mqs[i].setConfig(mqConf); break; } @@ -797,19 +795,26 @@ public final class Application { } } - String agent = propertiesConf.getValue("agent"); - if (agent != null && !agent.isEmpty() && !PropertiesAgent.class.getName().equals(agent)) { - Class clazz = (Class) classLoader.loadClass(agent); - if (!PropertiesAgent.class.isAssignableFrom(clazz)) { - throw new RuntimeException("PropertiesAgent class (" + agent + ") is not " + PropertiesAgent.class.getName() + " impl class"); + if ((dfloads == null && propertiesConf.getStringEntrys().length > 0) || (dfloads != null && propertiesConf.getStringEntrys().length > 1)) { + Iterator it = ServiceLoader.load(PropertiesAgentProvider.class, classLoader).iterator(); + RedkaleClassLoader.putServiceLoader(PropertiesAgentProvider.class); + List providers = new ArrayList<>(); + while (it.hasNext()) { + PropertiesAgentProvider provider = it.next(); + if (provider != null) RedkaleClassLoader.putReflectionPublicConstructors(provider.getClass(), provider.getClass().getName()); //loader class + if (provider != null && provider.acceptsConf(propertiesConf)) { + providers.add(provider); + } } - RedkaleClassLoader.putReflectionPublicConstructors(clazz, clazz.getName()); - this.propertiesAgent = clazz.getConstructor().newInstance(); - this.resourceFactory.inject(this.propertiesAgent); - if (compileMode) { - this.propertiesAgent.compile(propertiesConf); - } else { - this.propertiesAgent.init(resourceFactory, appProperties, propertiesConf); + for (PropertiesAgentProvider provider : InstanceProvider.sort(providers)) { + this.propertiesAgent = provider.createInstance(); + this.resourceFactory.inject(this.propertiesAgent); + if (compileMode) { + this.propertiesAgent.compile(propertiesConf); + } else { + this.propertiesAgent.init(resourceFactory, appProperties, propertiesConf); + } + break; } } } @@ -1009,39 +1014,34 @@ public final class Application { } String classval = sourceConf.getValue("type"); try { - Class sourceType = null; + CacheSource source = null; if (classval == null || classval.isEmpty()) { RedkaleClassLoader.putServiceLoader(CacheSourceProvider.class); List providers = new ArrayList<>(); Iterator it = ServiceLoader.load(CacheSourceProvider.class, serverClassLoader).iterator(); while (it.hasNext()) { - CacheSourceProvider s = it.next(); - if (s != null) RedkaleClassLoader.putReflectionPublicConstructors(s.getClass(), s.getClass().getName()); - if (s != null && s.acceptsConf(sourceConf)) { - providers.add(s); + CacheSourceProvider provider = it.next(); + if (provider != null) RedkaleClassLoader.putReflectionPublicConstructors(provider.getClass(), provider.getClass().getName()); + if (provider != null && provider.acceptsConf(sourceConf)) { + providers.add(provider); } } - Collections.sort(providers, (a, b) -> { - Priority p1 = a == null ? null : a.getClass().getAnnotation(Priority.class); - Priority p2 = b == null ? null : b.getClass().getAnnotation(Priority.class); - return (p2 == null ? 0 : p2.value()) - (p1 == null ? 0 : p1.value()); - }); - for (CacheSourceProvider provider : providers) { - sourceType = provider.sourceClass(); - if (sourceType != null) break; + for (CacheSourceProvider provider : InstanceProvider.sort(providers)) { + source = provider.createInstance(); + if (source != null) break; } - if (sourceType == null) { + if (source == null) { if (CacheMemorySource.acceptsConf(sourceConf)) { - sourceType = CacheMemorySource.class; + source = new CacheMemorySource(sourceName); } } } else { - sourceType = serverClassLoader.loadClass(classval); + Class sourceType = serverClassLoader.loadClass(classval); + RedkaleClassLoader.putReflectionPublicConstructors(sourceType, sourceType.getName()); + source = (CacheSource) sourceType.getConstructor().newInstance(); } - if (sourceType == null) throw new RuntimeException("Not found CacheSourceProvider for config=" + sourceConf); + if (source == null) throw new RuntimeException("Not found CacheSourceProvider for config=" + sourceConf); - RedkaleClassLoader.putReflectionPublicConstructors(sourceType, sourceType.getName()); - CacheSource source = sourceType == CacheMemorySource.class ? new CacheMemorySource(sourceName) : (CacheSource) sourceType.getConstructor().newInstance(); cacheSources.add(source); resourceFactory.register(sourceName, source); resourceFactory.inject(sourceName, source); @@ -1070,45 +1070,40 @@ public final class Application { } String classval = sourceConf.getValue("type"); try { - Class sourceType = null; + DataSource source = null; if (classval == null || classval.isEmpty()) { if (DataJdbcSource.acceptsConf(sourceConf)) { - sourceType = DataJdbcSource.class; + source = new DataJdbcSource(); } else { RedkaleClassLoader.putServiceLoader(DataSourceProvider.class); List providers = new ArrayList<>(); Iterator it = ServiceLoader.load(DataSourceProvider.class, serverClassLoader).iterator(); while (it.hasNext()) { - DataSourceProvider s = it.next(); - if (s != null) RedkaleClassLoader.putReflectionPublicConstructors(s.getClass(), s.getClass().getName()); - if (s != null && s.acceptsConf(sourceConf)) { - providers.add(s); + DataSourceProvider provider = it.next(); + if (provider != null) RedkaleClassLoader.putReflectionPublicConstructors(provider.getClass(), provider.getClass().getName()); + if (provider != null && provider.acceptsConf(sourceConf)) { + providers.add(provider); } } - Collections.sort(providers, (a, b) -> { - Priority p1 = a == null ? null : a.getClass().getAnnotation(Priority.class); - Priority p2 = b == null ? null : b.getClass().getAnnotation(Priority.class); - return (p2 == null ? 0 : p2.value()) - (p1 == null ? 0 : p1.value()); - }); - for (DataSourceProvider provider : providers) { - sourceType = provider.sourceClass(); - if (sourceType != null) break; + for (DataSourceProvider provider : InstanceProvider.sort(providers)) { + source = provider.createInstance(); + if (source != null) break; } - if (sourceType == null) { + if (source == null) { if (DataMemorySource.acceptsConf(sourceConf)) { - sourceType = DataMemorySource.class; + source = new DataMemorySource(sourceName); } } } } else { - sourceType = serverClassLoader.loadClass(classval); + Class sourceType = serverClassLoader.loadClass(classval); + RedkaleClassLoader.putReflectionPublicConstructors(sourceType, sourceType.getName()); + source = (DataSource) sourceType.getConstructor().newInstance(); } - if (sourceType == null) throw new RuntimeException("Not found DataSourceProvider for config=" + sourceConf); + if (source == null) throw new RuntimeException("Not found DataSourceProvider for config=" + sourceConf); - RedkaleClassLoader.putReflectionPublicConstructors(sourceType, sourceType.getName()); - DataSource source = sourceType == DataMemorySource.class ? new DataMemorySource(sourceName) : (DataSource) sourceType.getConstructor().newInstance(); dataSources.add(source); - if (sourceType == DataMemorySource.class && DataMemorySource.isSearchType(sourceConf)) { + if (source instanceof DataMemorySource && DataMemorySource.isSearchType(sourceConf)) { resourceFactory.register(sourceName, SearchSource.class, source); } else { resourceFactory.register(sourceName, source); diff --git a/src/main/java/org/redkale/boot/NodeServer.java b/src/main/java/org/redkale/boot/NodeServer.java index e41bdaf59..37627e7f7 100644 --- a/src/main/java/org/redkale/boot/NodeServer.java +++ b/src/main/java/org/redkale/boot/NodeServer.java @@ -15,6 +15,7 @@ import java.net.*; import java.nio.file.*; import java.util.*; import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.*; import java.util.logging.*; import javax.annotation.*; @@ -357,6 +358,7 @@ public abstract class NodeServer { ResourceFactory regFactory = isSNCP() ? application.getResourceFactory() : resourceFactory; final ResourceFactory appResourceFactory = application.getResourceFactory(); final TransportFactory appSncpTransFactory = application.getSncpTransportFactory(); + final AtomicInteger serviceCount = new AtomicInteger(); for (FilterEntry entry : entrys) { //service实现类 final Class serviceImplClass = entry.getType(); if (Modifier.isFinal(serviceImplClass.getModifiers())) continue; //修饰final的类跳过 @@ -422,6 +424,7 @@ public abstract class NodeServer { interceptorServices.add(service); if (consumer != null) consumer.accept(agent, service); } + serviceCount.incrementAndGet(); } catch (RuntimeException ex) { throw ex; } catch (Exception e) { @@ -502,7 +505,7 @@ public abstract class NodeServer { for (String s : wlist) { sb.append(s); } - sb.append(localThreadName).append("All Services load cost ").append(System.currentTimeMillis() - starts).append(" ms" + LINE_SEPARATOR); + sb.append(localThreadName).append("All " + localServices.size() + " Services load cost ").append(System.currentTimeMillis() - starts).append(" ms"); } if (sb != null && preinite > 10) sb.append(localThreadName).append(ClusterAgent.class.getSimpleName()).append(" register ").append(preinite).append(" ms" + LINE_SEPARATOR); if (sb != null && sb.length() > 0) logger.log(Level.INFO, sb.toString()); diff --git a/src/main/java/org/redkale/boot/PropertiesAgent.java b/src/main/java/org/redkale/boot/PropertiesAgent.java index aa5379877..024701fbb 100644 --- a/src/main/java/org/redkale/boot/PropertiesAgent.java +++ b/src/main/java/org/redkale/boot/PropertiesAgent.java @@ -3,6 +3,7 @@ package org.redkale.boot; import java.util.Properties; +import java.util.logging.Logger; import org.redkale.util.*; /** @@ -17,11 +18,9 @@ import org.redkale.util.*; */ public abstract class PropertiesAgent { - public static final String PROP_KEY_URL = "url"; - public static final String PROP_KEY_NAMESPACE = "namespace"; - public static final String PROP_NAMESPACE_APPLICATION = "application"; + protected final Logger logger = Logger.getLogger(this.getClass().getSimpleName()); /** * 编译时进行的操作 @@ -31,6 +30,15 @@ public abstract class PropertiesAgent { public void compile(AnyValue conf) { } + /** + * ServiceLoader时判断配置是否符合当前实现类 + * + * @param config 节点配置 + * + * @return boolean + */ + public abstract boolean acceptsConf(AnyValue config); + /** * 初始化配置源,配置项需要写入appProperties,并监听配置项的变化 * diff --git a/src/main/java/org/redkale/boot/PropertiesAgentProvider.java b/src/main/java/org/redkale/boot/PropertiesAgentProvider.java new file mode 100644 index 000000000..075090d81 --- /dev/null +++ b/src/main/java/org/redkale/boot/PropertiesAgentProvider.java @@ -0,0 +1,19 @@ +/* + */ +package org.redkale.boot; + +import org.redkale.util.*; + +/** + * 自定义的PropertiesAgent加载器 + * + * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + * @since 2.8.0 + */ +public interface PropertiesAgentProvider extends InstanceProvider { + +} diff --git a/src/main/java/org/redkale/cluster/ClusterAgent.java b/src/main/java/org/redkale/cluster/ClusterAgent.java index a201e531c..f396604b2 100644 --- a/src/main/java/org/redkale/cluster/ClusterAgent.java +++ b/src/main/java/org/redkale/cluster/ClusterAgent.java @@ -86,7 +86,13 @@ public abstract class ClusterAgent { public void destroy(AnyValue config) { } - //ServiceLoader时判断配置是否符合当前实现类 + /** + * ServiceLoader时判断配置是否符合当前实现类 + * + * @param config 节点配置 + * + * @return boolean + */ public abstract boolean acceptsConf(AnyValue config); public boolean containsProtocol(String protocol) { diff --git a/src/main/java/org/redkale/cluster/ClusterAgentProvider.java b/src/main/java/org/redkale/cluster/ClusterAgentProvider.java index 7c5f25de6..b8b24d27a 100644 --- a/src/main/java/org/redkale/cluster/ClusterAgentProvider.java +++ b/src/main/java/org/redkale/cluster/ClusterAgentProvider.java @@ -5,7 +5,7 @@ */ package org.redkale.cluster; -import org.redkale.util.AnyValue; +import org.redkale.util.*; /** * 自定义的ClusterAgent加载器 @@ -17,9 +17,6 @@ import org.redkale.util.AnyValue; * @author zhangjx * @since 2.5.0 */ -public interface ClusterAgentProvider { +public interface ClusterAgentProvider extends InstanceProvider { - public boolean acceptsConf(AnyValue config); - - public Class agentClass(); } diff --git a/src/main/java/org/redkale/convert/ConvertFactory.java b/src/main/java/org/redkale/convert/ConvertFactory.java index f3774447b..5b6396824 100644 --- a/src/main/java/org/redkale/convert/ConvertFactory.java +++ b/src/main/java/org/redkale/convert/ConvertFactory.java @@ -531,8 +531,8 @@ public abstract class ConvertFactory { } if (coder == null) { try { - coder = (SimpledCoder) clazz1.getConstructor().newInstance(); RedkaleClassLoader.putReflectionPublicConstructors(clazz1, clazz1.getName()); + coder = (SimpledCoder) clazz1.getConstructor().newInstance(); } catch (Throwable t) { t.printStackTrace(); continue; diff --git a/src/main/java/org/redkale/mq/MessageAgentProvider.java b/src/main/java/org/redkale/mq/MessageAgentProvider.java index c05570ac8..1e9526614 100644 --- a/src/main/java/org/redkale/mq/MessageAgentProvider.java +++ b/src/main/java/org/redkale/mq/MessageAgentProvider.java @@ -5,7 +5,7 @@ */ package org.redkale.mq; -import org.redkale.util.AnyValue; +import org.redkale.util.*; /** * 自定义的MessageAgent加载器 @@ -17,9 +17,6 @@ import org.redkale.util.AnyValue; * @author zhangjx * @since 2.5.0 */ -public interface MessageAgentProvider { +public interface MessageAgentProvider extends InstanceProvider { - public boolean acceptsConf(AnyValue config); - - public Class agentClass(); } diff --git a/src/main/java/org/redkale/net/SSLBuilder.java b/src/main/java/org/redkale/net/SSLBuilder.java index 1679529d7..726247112 100644 --- a/src/main/java/org/redkale/net/SSLBuilder.java +++ b/src/main/java/org/redkale/net/SSLBuilder.java @@ -57,10 +57,12 @@ public class SSLBuilder { Provider jsseProvider = null; if (sslProviderImpl != null) { Class providerClass = (Class) Thread.currentThread().getContextClassLoader().loadClass(sslProviderImpl); + RedkaleClassLoader.putReflectionPublicConstructors(providerClass, providerClass.getName()); sslProvider = providerClass.getConstructor().newInstance(); } if (jsseProviderImpl != null) { Class providerClass = (Class) Thread.currentThread().getContextClassLoader().loadClass(jsseProviderImpl); + RedkaleClassLoader.putReflectionPublicConstructors(providerClass, providerClass.getName()); jsseProvider = providerClass.getConstructor().newInstance(); } @@ -126,7 +128,7 @@ public class SSLBuilder { } if (!unset.isEmpty()) { logger.log(Level.WARNING, "protocols " + unset + " is not supported, only support: " + Arrays.toString(protocolArray)); - } + } } if (!enabledCiphers.isEmpty()) { HashSet set = new HashSet<>(); diff --git a/src/main/java/org/redkale/net/Server.java b/src/main/java/org/redkale/net/Server.java index 59958fc9c..1d4f5396e 100644 --- a/src/main/java/org/redkale/net/Server.java +++ b/src/main/java/org/redkale/net/Server.java @@ -288,7 +288,7 @@ public abstract class Server { - public boolean acceptsConf(AnyValue config); - - public Class sourceClass(); } diff --git a/src/main/java/org/redkale/source/DataSourceProvider.java b/src/main/java/org/redkale/source/DataSourceProvider.java index e8e605ed0..aa1603038 100644 --- a/src/main/java/org/redkale/source/DataSourceProvider.java +++ b/src/main/java/org/redkale/source/DataSourceProvider.java @@ -5,7 +5,7 @@ */ package org.redkale.source; -import org.redkale.util.AnyValue; +import org.redkale.util.*; /** * @@ -17,9 +17,6 @@ import org.redkale.util.AnyValue; * @author zhangjx * @since 2.5.0 */ -public interface DataSourceProvider { +public interface DataSourceProvider extends InstanceProvider { - public boolean acceptsConf(AnyValue config); - - public Class sourceClass(); } diff --git a/src/main/java/org/redkale/util/InstanceProvider.java b/src/main/java/org/redkale/util/InstanceProvider.java new file mode 100644 index 000000000..8c05fa724 --- /dev/null +++ b/src/main/java/org/redkale/util/InstanceProvider.java @@ -0,0 +1,34 @@ +/* + */ +package org.redkale.util; + +import java.util.*; +import javax.annotation.Priority; + +/** + * 配置源Agent的Provider + * + * + * 详情见: https://redkale.org + * + * @author zhangjx + * @param XXXAgent + * + * @since 2.8.0 + */ +public interface InstanceProvider { + + public boolean acceptsConf(AnyValue config); + + public V createInstance(); + + //值大排前面 + public static

List

sort(List

providers) { + Collections.sort(providers, (a, b) -> { + Priority p1 = a == null ? null : a.getClass().getAnnotation(Priority.class); + Priority p2 = b == null ? null : b.getClass().getAnnotation(Priority.class); + return (p2 == null ? 0 : p2.value()) - (p1 == null ? 0 : p1.value()); + }); + return providers; + } +}