diff --git a/ribbon-archaius/src/main/java/com/netflix/client/config/DefaultClientConfigImpl.java b/ribbon-archaius/src/main/java/com/netflix/client/config/DefaultClientConfigImpl.java index a7bff78f..6059497b 100644 --- a/ribbon-archaius/src/main/java/com/netflix/client/config/DefaultClientConfigImpl.java +++ b/ribbon-archaius/src/main/java/com/netflix/client/config/DefaultClientConfigImpl.java @@ -301,47 +301,47 @@ public DefaultClientConfigImpl(String nameSpace) { } public void loadDefaultValues() { - set(CommonClientConfigKey.MaxHttpConnectionsPerHost, getDefaultMaxHttpConnectionsPerHost()); - set(CommonClientConfigKey.MaxTotalHttpConnections, getDefaultMaxTotalHttpConnections()); - set(CommonClientConfigKey.EnableConnectionPool, getDefaultEnableConnectionPool()); - set(CommonClientConfigKey.MaxConnectionsPerHost, getDefaultMaxConnectionsPerHost()); - set(CommonClientConfigKey.MaxTotalConnections, getDefaultMaxTotalConnections()); - set(CommonClientConfigKey.ConnectTimeout, getDefaultConnectTimeout()); - set(CommonClientConfigKey.ConnectionManagerTimeout, getDefaultConnectionManagerTimeout()); - set(CommonClientConfigKey.ReadTimeout, getDefaultReadTimeout()); - set(CommonClientConfigKey.MaxAutoRetries, getDefaultMaxAutoRetries()); - set(CommonClientConfigKey.MaxAutoRetriesNextServer, getDefaultMaxAutoRetriesNextServer()); - set(CommonClientConfigKey.OkToRetryOnAllOperations, getDefaultOkToRetryOnAllOperations()); - set(CommonClientConfigKey.FollowRedirects, getDefaultFollowRedirects()); - set(CommonClientConfigKey.ConnectionPoolCleanerTaskEnabled, getDefaultConnectionPoolCleanerTaskEnabled()); - set(CommonClientConfigKey.ConnIdleEvictTimeMilliSeconds, getDefaultConnectionidleTimeInMsecs()); - set(CommonClientConfigKey.ConnectionCleanerRepeatInterval, getDefaultConnectionIdleTimertaskRepeatInMsecs()); - set(CommonClientConfigKey.EnableGZIPContentEncodingFilter, getDefaultEnableGzipContentEncodingFilter()); - set(CommonClientConfigKey.ProxyHost, null); - set(CommonClientConfigKey.ProxyPort, null); - set(CommonClientConfigKey.Port, getDefaultPort()); - set(CommonClientConfigKey.EnablePrimeConnections, getDefaultEnablePrimeConnections()); - set(CommonClientConfigKey.MaxRetriesPerServerPrimeConnection, getDefaultMaxRetriesPerServerPrimeConnection()); - set(CommonClientConfigKey.MaxTotalTimeToPrimeConnections, getDefaultMaxTotalTimeToPrimeConnections()); - set(CommonClientConfigKey.PrimeConnectionsURI, getDefaultPrimeConnectionsUri()); - set(CommonClientConfigKey.PoolMinThreads, getDefaultPoolMinThreads()); - set(CommonClientConfigKey.PoolMaxThreads, getDefaultPoolMaxThreads()); - set(CommonClientConfigKey.PoolKeepAliveTime, (int)getDefaultPoolKeepAliveTime()); - set(CommonClientConfigKey.PoolKeepAliveTimeUnits, getDefaultPoolKeepAliveTimeUnits().toString()); - set(CommonClientConfigKey.EnableZoneAffinity, getDefaultEnableZoneAffinity()); - set(CommonClientConfigKey.EnableZoneExclusivity, getDefaultEnableZoneExclusivity()); - set(CommonClientConfigKey.ClientClassName, getDefaultClientClassname()); - set(CommonClientConfigKey.NFLoadBalancerClassName, getDefaultNfloadbalancerClassname()); - set(CommonClientConfigKey.NFLoadBalancerRuleClassName, getDefaultNfloadbalancerRuleClassname()); - set(CommonClientConfigKey.NFLoadBalancerPingClassName, getDefaultNfloadbalancerPingClassname()); - set(CommonClientConfigKey.PrioritizeVipAddressBasedServers, getDefaultPrioritizeVipAddressBasedServers()); - set(CommonClientConfigKey.MinPrimeConnectionsRatio, getDefaultMinPrimeConnectionsRatio()); - set(CommonClientConfigKey.PrimeConnectionsClassName, getDefaultPrimeConnectionsClass()); - set(CommonClientConfigKey.NIWSServerListClassName, getDefaultSeverListClass()); - set(CommonClientConfigKey.VipAddressResolverClassName, getDefaultVipaddressResolverClassname()); - set(CommonClientConfigKey.IsClientAuthRequired, getDefaultIsClientAuthRequired()); - set(CommonClientConfigKey.UseIPAddrForServer, getDefaultUseIpAddressForServer()); - set(CommonClientConfigKey.ListOfServers, ""); + setDefault(CommonClientConfigKey.MaxHttpConnectionsPerHost, getDefaultMaxHttpConnectionsPerHost()); + setDefault(CommonClientConfigKey.MaxTotalHttpConnections, getDefaultMaxTotalHttpConnections()); + setDefault(CommonClientConfigKey.EnableConnectionPool, getDefaultEnableConnectionPool()); + setDefault(CommonClientConfigKey.MaxConnectionsPerHost, getDefaultMaxConnectionsPerHost()); + setDefault(CommonClientConfigKey.MaxTotalConnections, getDefaultMaxTotalConnections()); + setDefault(CommonClientConfigKey.ConnectTimeout, getDefaultConnectTimeout()); + setDefault(CommonClientConfigKey.ConnectionManagerTimeout, getDefaultConnectionManagerTimeout()); + setDefault(CommonClientConfigKey.ReadTimeout, getDefaultReadTimeout()); + setDefault(CommonClientConfigKey.MaxAutoRetries, getDefaultMaxAutoRetries()); + setDefault(CommonClientConfigKey.MaxAutoRetriesNextServer, getDefaultMaxAutoRetriesNextServer()); + setDefault(CommonClientConfigKey.OkToRetryOnAllOperations, getDefaultOkToRetryOnAllOperations()); + setDefault(CommonClientConfigKey.FollowRedirects, getDefaultFollowRedirects()); + setDefault(CommonClientConfigKey.ConnectionPoolCleanerTaskEnabled, getDefaultConnectionPoolCleanerTaskEnabled()); + setDefault(CommonClientConfigKey.ConnIdleEvictTimeMilliSeconds, getDefaultConnectionidleTimeInMsecs()); + setDefault(CommonClientConfigKey.ConnectionCleanerRepeatInterval, getDefaultConnectionIdleTimertaskRepeatInMsecs()); + setDefault(CommonClientConfigKey.EnableGZIPContentEncodingFilter, getDefaultEnableGzipContentEncodingFilter()); + setDefault(CommonClientConfigKey.ProxyHost, null); + setDefault(CommonClientConfigKey.ProxyPort, null); + setDefault(CommonClientConfigKey.Port, getDefaultPort()); + setDefault(CommonClientConfigKey.EnablePrimeConnections, getDefaultEnablePrimeConnections()); + setDefault(CommonClientConfigKey.MaxRetriesPerServerPrimeConnection, getDefaultMaxRetriesPerServerPrimeConnection()); + setDefault(CommonClientConfigKey.MaxTotalTimeToPrimeConnections, getDefaultMaxTotalTimeToPrimeConnections()); + setDefault(CommonClientConfigKey.PrimeConnectionsURI, getDefaultPrimeConnectionsUri()); + setDefault(CommonClientConfigKey.PoolMinThreads, getDefaultPoolMinThreads()); + setDefault(CommonClientConfigKey.PoolMaxThreads, getDefaultPoolMaxThreads()); + setDefault(CommonClientConfigKey.PoolKeepAliveTime, (int)getDefaultPoolKeepAliveTime()); + setDefault(CommonClientConfigKey.PoolKeepAliveTimeUnits, getDefaultPoolKeepAliveTimeUnits().toString()); + setDefault(CommonClientConfigKey.EnableZoneAffinity, getDefaultEnableZoneAffinity()); + setDefault(CommonClientConfigKey.EnableZoneExclusivity, getDefaultEnableZoneExclusivity()); + setDefault(CommonClientConfigKey.ClientClassName, getDefaultClientClassname()); + setDefault(CommonClientConfigKey.NFLoadBalancerClassName, getDefaultNfloadbalancerClassname()); + setDefault(CommonClientConfigKey.NFLoadBalancerRuleClassName, getDefaultNfloadbalancerRuleClassname()); + setDefault(CommonClientConfigKey.NFLoadBalancerPingClassName, getDefaultNfloadbalancerPingClassname()); + setDefault(CommonClientConfigKey.PrioritizeVipAddressBasedServers, getDefaultPrioritizeVipAddressBasedServers()); + setDefault(CommonClientConfigKey.MinPrimeConnectionsRatio, getDefaultMinPrimeConnectionsRatio()); + setDefault(CommonClientConfigKey.PrimeConnectionsClassName, getDefaultPrimeConnectionsClass()); + setDefault(CommonClientConfigKey.NIWSServerListClassName, getDefaultSeverListClass()); + setDefault(CommonClientConfigKey.VipAddressResolverClassName, getDefaultVipaddressResolverClassname()); + setDefault(CommonClientConfigKey.IsClientAuthRequired, getDefaultIsClientAuthRequired()); + setDefault(CommonClientConfigKey.UseIPAddrForServer, getDefaultUseIpAddressForServer()); + setDefault(CommonClientConfigKey.ListOfServers, ""); } @Deprecated diff --git a/ribbon-core/src/main/java/com/netflix/client/config/ReloadableClientConfig.java b/ribbon-core/src/main/java/com/netflix/client/config/ReloadableClientConfig.java index 1ba638bb..e2b16c29 100644 --- a/ribbon-core/src/main/java/com/netflix/client/config/ReloadableClientConfig.java +++ b/ribbon-core/src/main/java/com/netflix/client/config/ReloadableClientConfig.java @@ -55,7 +55,7 @@ public abstract class ReloadableClientConfig implements IClientConfig { private String namespace = DEFAULT_NAMESPACE; - private boolean isLoaded = false; + private boolean isDynamic = false; protected ReloadableClientConfig(PropertyResolver resolver) { this.resolver = resolver; @@ -99,15 +99,13 @@ public final void setNameSpace(String nameSpace) { @Override public void loadProperties(String clientName) { - Preconditions.checkState(!isLoaded, "Config '{}' can only be loaded once", clientName); - - LOG.info("Loading config for `{}`", clientName); + LOG.info("[{}] loading config", clientName); this.clientName = clientName; - this.isLoaded = true; + this.isDynamic = true; loadDefaultValues(); resolver.onChange(this::reload); - internalProperties.forEach((key, value) -> LOG.info("{} : {} -> {}", clientName, key, value.orElse(null))); + internalProperties.forEach((key, value) -> LOG.info("[{}] {}={}", clientName, key, value.orElse(null))); } /** @@ -148,8 +146,8 @@ private void autoRefreshFromPropertyResolver(final IClientConfigKey key) return () -> { final Optional next = valueSupplier.get(); if (!next.equals(previous.get())) { - LOG.info("New value {}: {} -> {}", key.key(), previous.get(), next); - previous.set(next); + LOG.info("[{}] new value for {}: {} -> {}", clientName, key.key(), previous.get(), next); + previous.set(next); internalProperties.put(key, next); } }; @@ -208,7 +206,7 @@ public String toString() { public final T get(IClientConfigKey key) { Optional value = (Optional)internalProperties.get(key); if (value == null) { - if (!isLoaded) { + if (!isDynamic) { return null; } else { set(key, null); @@ -221,7 +219,7 @@ public final T get(IClientConfigKey key) { @Override public final Property getGlobalProperty(IClientConfigKey key) { - LOG.debug("Get global property {} default {}", key.key(), key.defaultValue()); + LOG.debug("[{}] get global property '{}' with default '{}'", clientName, key.key(), key.defaultValue()); return getOrCreateProperty( key, @@ -231,11 +229,9 @@ public final Property getGlobalProperty(IClientConfigKey key) { @Override public final Property getDynamicProperty(IClientConfigKey key) { - LOG.debug("Get dynamic property key={} ns={} client={}", key.key(), getNameSpace(), clientName); + LOG.debug("[{}] get dynamic property key={} ns={}", clientName, key.key(), getNameSpace()); - if (isLoaded) { - autoRefreshFromPropertyResolver(key); - } + get(key); return getOrCreateProperty( key, @@ -245,7 +241,7 @@ public final Property getDynamicProperty(IClientConfigKey key) { @Override public Property getPrefixMappedProperty(IClientConfigKey key) { - LOG.debug("Get dynamic property key={} ns={} client={}", key.key(), getNameSpace(), clientName); + LOG.debug("[{}] get dynamic property key={} ns={} client={}", clientName, key.key(), getNameSpace()); return getOrCreateProperty( key, @@ -254,14 +250,9 @@ public Property getPrefixMappedProperty(IClientConfigKey key) { } /** - * Resolve a properties final value in the following order or precedence + * Resolve a property's final value from the property value. * - client scope * - default scope - * - internally set default - * - IClientConfigKey defaultValue - * @param key - * @param - * @return */ private Optional resolveFromPropertyResolver(IClientConfigKey key) { Optional value; @@ -353,12 +344,33 @@ public final T get(IClientConfigKey key, T defaultValue) { return Optional.ofNullable(get(key)).orElse(defaultValue); } + /** + * Store the implicit default value for key while giving precedence to default values in the property resolver + */ + protected final void setDefault(IClientConfigKey key) { + setDefault(key, key.defaultValue()); + } + + /** + * Store the default value for key while giving precedence to default values in the property resolver + */ + protected final void setDefault(IClientConfigKey key, T value) { + Preconditions.checkArgument(key != null, "key cannot be null"); + + value = resolveFromPropertyResolver(key).orElse(value); + internalProperties.put(key, Optional.ofNullable(value)); + if (isDynamic) { + autoRefreshFromPropertyResolver(key); + } + cachedToString = null; + } + @Override public IClientConfig set(IClientConfigKey key, T value) { Preconditions.checkArgument(key != null, "key cannot be null"); value = resolveValueToType(key, value); - if (isLoaded) { + if (isDynamic) { internalProperties.put(key, Optional.ofNullable(resolveFromPropertyResolver(key).orElse(value))); autoRefreshFromPropertyResolver(key); } else {