You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2022/12/14 03:45:03 UTC
[dubbo] branch 3.1 updated: Fix timeout being cached in InstanceAddressURL (#11041)
This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.1
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.1 by this push:
new 0108dd5e69 Fix timeout being cached in InstanceAddressURL (#11041)
0108dd5e69 is described below
commit 0108dd5e69046b9908984cf4f3616a5fe41a0bda
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Wed Dec 14 11:44:18 2022 +0800
Fix timeout being cached in InstanceAddressURL (#11041)
---
.../src/main/java/org/apache/dubbo/common/URL.java | 243 ++----------
.../common/url/component/ServiceConfigURL.java | 413 +++++++++++++++++++++
.../dubbo/registry/client/InstanceAddressURL.java | 40 --
.../client/OverrideInstanceAddressURL.java | 32 --
4 files changed, 438 insertions(+), 290 deletions(-)
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java b/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
index ca028aed06..f689cf25b9 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
@@ -54,7 +54,6 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.TreeMap;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
import static org.apache.dubbo.common.BaseServiceMetadata.COLON_SEPARATOR;
@@ -123,12 +122,6 @@ class URL implements Serializable {
// ==== cache ====
- private volatile transient Map<String, Number> numbers;
-
- private volatile transient Map<String, Map<String, Number>> methodNumbers;
-
- private volatile transient Map<String, URL> urls;
-
private transient String serviceKey;
private transient String protocolServiceKey;
protected volatile Map<String, Object> attributes;
@@ -663,125 +656,62 @@ class URL implements Serializable {
return (ServiceModel) getAttribute(CommonConstants.SERVICE_MODEL);
}
- protected Map<String, Number> getNumbers() {
- // concurrent initialization is tolerant
- if (numbers == null) {
- numbers = new ConcurrentHashMap<>();
- }
- return numbers;
- }
- protected Map<String, Map<String, Number>> getMethodNumbers() {
- if (methodNumbers == null) { // concurrent initialization is tolerant
- methodNumbers = new ConcurrentHashMap<>();
- }
- return methodNumbers;
- }
-
- private Map<String, URL> getUrls() {
- // concurrent initialization is tolerant
- if (urls == null) {
- urls = new ConcurrentHashMap<>();
- }
- return urls;
- }
public URL getUrlParameter(String key) {
- URL u = getUrls().get(key);
- if (u != null) {
- return u;
- }
String value = getParameterAndDecoded(key);
if (StringUtils.isEmpty(value)) {
return null;
}
- u = URL.valueOf(value);
- getUrls().put(key, u);
- return u;
+ return URL.valueOf(value);
}
public double getParameter(String key, double defaultValue) {
- Number n = getNumbers().get(key);
- if (n != null) {
- return n.doubleValue();
- }
String value = getParameter(key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- double d = Double.parseDouble(value);
- getNumbers().put(key, d);
- return d;
+ return Double.parseDouble(value);
}
public float getParameter(String key, float defaultValue) {
- Number n = getNumbers().get(key);
- if (n != null) {
- return n.floatValue();
- }
String value = getParameter(key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- float f = Float.parseFloat(value);
- getNumbers().put(key, f);
- return f;
+ return Float.parseFloat(value);
}
public long getParameter(String key, long defaultValue) {
- Number n = getNumbers().get(key);
- if (n != null) {
- return n.longValue();
- }
String value = getParameter(key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- long l = Long.parseLong(value);
- getNumbers().put(key, l);
- return l;
+ return Long.parseLong(value);
}
public int getParameter(String key, int defaultValue) {
- Number n = getNumbers().get(key);
- if (n != null) {
- return n.intValue();
- }
String value = getParameter(key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- int i = Integer.parseInt(value);
- getNumbers().put(key, i);
- return i;
+ return Integer.parseInt(value);
}
public short getParameter(String key, short defaultValue) {
- Number n = getNumbers().get(key);
- if (n != null) {
- return n.shortValue();
- }
String value = getParameter(key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- short s = Short.parseShort(value);
- getNumbers().put(key, s);
- return s;
+ return Short.parseShort(value);
}
public byte getParameter(String key, byte defaultValue) {
- Number n = getNumbers().get(key);
- if (n != null) {
- return n.byteValue();
- }
String value = getParameter(key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- byte b = Byte.parseByte(value);
- getNumbers().put(key, b);
- return b;
+ return Byte.parseByte(value);
}
public float getPositiveParameter(String key, float defaultValue) {
@@ -869,100 +799,51 @@ class URL implements Serializable {
}
public double getMethodParameter(String method, String key, double defaultValue) {
- Number n = getCachedNumber(method, key);
- if (n != null) {
- return n.doubleValue();
- }
String value = getMethodParameter(method, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- double d = Double.parseDouble(value);
- updateCachedNumber(method, key, d);
- return d;
+ return Double.parseDouble(value);
}
public float getMethodParameter(String method, String key, float defaultValue) {
- Number n = getCachedNumber(method, key);
- if (n != null) {
- return n.floatValue();
- }
String value = getMethodParameter(method, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- float f = Float.parseFloat(value);
- updateCachedNumber(method, key, f);
- return f;
+ return Float.parseFloat(value);
}
public long getMethodParameter(String method, String key, long defaultValue) {
- Number n = getCachedNumber(method, key);
- if (n != null) {
- return n.longValue();
- }
String value = getMethodParameter(method, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- long l = Long.parseLong(value);
- updateCachedNumber(method, key, l);
- return l;
+ return Long.parseLong(value);
}
public int getMethodParameter(String method, String key, int defaultValue) {
- Number n = getCachedNumber(method, key);
- if (n != null) {
- return n.intValue();
- }
String value = getMethodParameter(method, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- int i = Integer.parseInt(value);
- updateCachedNumber(method, key, i);
- return i;
+ return Integer.parseInt(value);
}
public short getMethodParameter(String method, String key, short defaultValue) {
- Number n = getCachedNumber(method, key);
- if (n != null) {
- return n.shortValue();
- }
String value = getMethodParameter(method, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- short s = Short.parseShort(value);
- updateCachedNumber(method, key, s);
- return s;
+ return Short.parseShort(value);
}
public byte getMethodParameter(String method, String key, byte defaultValue) {
- Number n = getCachedNumber(method, key);
- if (n != null) {
- return n.byteValue();
- }
String value = getMethodParameter(method, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- byte b = Byte.parseByte(value);
- updateCachedNumber(method, key, b);
- return b;
- }
-
- private Number getCachedNumber(String method, String key) {
- Map<String, Number> keyNumber = getMethodNumbers().get(method);
- if (keyNumber != null) {
- return keyNumber.get(key);
- }
- return null;
- }
-
- private void updateCachedNumber(String method, String key, Number n) {
- Map<String, Number> keyNumber = getMethodNumbers().computeIfAbsent(method, m -> new HashMap<>());
- keyNumber.put(key, n);
+ return Byte.parseByte(value);
}
public double getMethodPositiveParameter(String method, String key, double defaultValue) {
@@ -1733,73 +1614,43 @@ class URL implements Serializable {
}
public double getServiceParameter(String service, String key, double defaultValue) {
- Number n = getServiceNumbers(service).get(key);
- if (n != null) {
- return n.doubleValue();
- }
String value = getServiceParameter(service, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- double d = Double.parseDouble(value);
- getNumbers().put(key, d);
- return d;
+ return Double.parseDouble(value);
}
public float getServiceParameter(String service, String key, float defaultValue) {
- Number n = getNumbers().get(key);
- if (n != null) {
- return n.floatValue();
- }
String value = getServiceParameter(service, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- float f = Float.parseFloat(value);
- getNumbers().put(key, f);
- return f;
+ return Float.parseFloat(value);
}
public long getServiceParameter(String service, String key, long defaultValue) {
- Number n = getNumbers().get(key);
- if (n != null) {
- return n.longValue();
- }
String value = getServiceParameter(service, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- long l = Long.parseLong(value);
- getNumbers().put(key, l);
- return l;
+ return Long.parseLong(value);
}
public short getServiceParameter(String service, String key, short defaultValue) {
- Number n = getNumbers().get(key);
- if (n != null) {
- return n.shortValue();
- }
String value = getServiceParameter(service, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- short s = Short.parseShort(value);
- getNumbers().put(key, s);
- return s;
+ return Short.parseShort(value);
}
public byte getServiceParameter(String service, String key, byte defaultValue) {
- Number n = getNumbers().get(key);
- if (n != null) {
- return n.byteValue();
- }
String value = getServiceParameter(service, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- byte b = Byte.parseByte(value);
- getNumbers().put(key, b);
- return b;
+ return Byte.parseByte(value);
}
public char getServiceParameter(String service, String key, char defaultValue) {
@@ -1887,87 +1738,51 @@ class URL implements Serializable {
}
public double getServiceMethodParameter(String service, String method, String key, double defaultValue) {
- Number n = getCachedNumber(method, key);
- if (n != null) {
- return n.doubleValue();
- }
String value = getServiceMethodParameter(service, method, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- double d = Double.parseDouble(value);
- updateCachedNumber(method, key, d);
- return d;
+ return Double.parseDouble(value);
}
public float getServiceMethodParameter(String service, String method, String key, float defaultValue) {
- Number n = getCachedNumber(method, key);
- if (n != null) {
- return n.floatValue();
- }
String value = getServiceMethodParameter(service, method, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- float f = Float.parseFloat(value);
- updateCachedNumber(method, key, f);
- return f;
+ return Float.parseFloat(value);
}
public long getServiceMethodParameter(String service, String method, String key, long defaultValue) {
- Number n = getCachedNumber(method, key);
- if (n != null) {
- return n.longValue();
- }
String value = getServiceMethodParameter(service, method, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- long l = Long.parseLong(value);
- updateCachedNumber(method, key, l);
- return l;
+ return Long.parseLong(value);
}
public int getServiceMethodParameter(String service, String method, String key, int defaultValue) {
- Number n = getCachedNumber(method, key);
- if (n != null) {
- return n.intValue();
- }
String value = getServiceMethodParameter(service, method, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- int i = Integer.parseInt(value);
- updateCachedNumber(method, key, i);
- return i;
+ return Integer.parseInt(value);
}
- public short getMethodParameter(String service, String method, String key, short defaultValue) {
- Number n = getCachedNumber(method, key);
- if (n != null) {
- return n.shortValue();
- }
+ public short getServiceMethodParameter(String service, String method, String key, short defaultValue) {
String value = getServiceMethodParameter(service, method, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- short s = Short.parseShort(value);
- updateCachedNumber(method, key, s);
- return s;
+ return Short.parseShort(value);
}
public byte getServiceMethodParameter(String service, String method, String key, byte defaultValue) {
- Number n = getCachedNumber(method, key);
- if (n != null) {
- return n.byteValue();
- }
String value = getServiceMethodParameter(service, method, key);
if (StringUtils.isEmpty(value)) {
return defaultValue;
}
- byte b = Byte.parseByte(value);
- updateCachedNumber(method, key, b);
- return b;
+ return Byte.parseByte(value);
}
public boolean hasServiceMethodParameter(String service, String method, String key) {
@@ -1978,14 +1793,6 @@ class URL implements Serializable {
return hasMethodParameter(method);
}
- protected Map<String, Number> getServiceNumbers(String service) {
- return getNumbers();
- }
-
- protected Map<String, Map<String, Number>> getServiceMethodNumbers(String service) {
- return getMethodNumbers();
- }
-
public URL toSerializableURL() {
return returnURL(URLPlainParam.toURLPlainParam(urlParam));
}
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/ServiceConfigURL.java b/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/ServiceConfigURL.java
index fc67804b9a..95bdb75110 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/ServiceConfigURL.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/url/component/ServiceConfigURL.java
@@ -18,12 +18,18 @@ package org.apache.dubbo.common.url.component;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.StringUtils;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
public class ServiceConfigURL extends URL {
+
+ private volatile transient Map<String, URL> urls;
+ private volatile transient Map<String, Number> numbers;
+ private volatile transient Map<String, Map<String, Number>> methodNumbers;
private volatile transient String full;
private volatile transient String string;
private volatile transient String identity;
@@ -157,4 +163,411 @@ public class ServiceConfigURL extends URL {
}
return parameter = super.toParameterString();
}
+
+
+ @Override
+ public URL getUrlParameter(String key) {
+ URL u = getUrls().get(key);
+ if (u != null) {
+ return u;
+ }
+ String value = getParameterAndDecoded(key);
+ if (StringUtils.isEmpty(value)) {
+ return null;
+ }
+ u = URL.valueOf(value);
+ getUrls().put(key, u);
+ return u;
+ }
+
+ @Override
+ public double getParameter(String key, double defaultValue) {
+ Number n = getNumbers().get(key);
+ if (n != null) {
+ return n.doubleValue();
+ }
+ String value = getParameter(key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ double d = Double.parseDouble(value);
+ getNumbers().put(key, d);
+ return d;
+ }
+
+ @Override
+ public float getParameter(String key, float defaultValue) {
+ Number n = getNumbers().get(key);
+ if (n != null) {
+ return n.floatValue();
+ }
+ String value = getParameter(key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ float f = Float.parseFloat(value);
+ getNumbers().put(key, f);
+ return f;
+ }
+
+ @Override
+ public long getParameter(String key, long defaultValue) {
+ Number n = getNumbers().get(key);
+ if (n != null) {
+ return n.longValue();
+ }
+ String value = getParameter(key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ long l = Long.parseLong(value);
+ getNumbers().put(key, l);
+ return l;
+ }
+
+ @Override
+ public int getParameter(String key, int defaultValue) {
+ Number n = getNumbers().get(key);
+ if (n != null) {
+ return n.intValue();
+ }
+ String value = getParameter(key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ int i = Integer.parseInt(value);
+ getNumbers().put(key, i);
+ return i;
+ }
+
+ @Override
+ public short getParameter(String key, short defaultValue) {
+ Number n = getNumbers().get(key);
+ if (n != null) {
+ return n.shortValue();
+ }
+ String value = getParameter(key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ short s = Short.parseShort(value);
+ getNumbers().put(key, s);
+ return s;
+ }
+
+ @Override
+ public byte getParameter(String key, byte defaultValue) {
+ Number n = getNumbers().get(key);
+ if (n != null) {
+ return n.byteValue();
+ }
+ String value = getParameter(key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ byte b = Byte.parseByte(value);
+ getNumbers().put(key, b);
+ return b;
+ }
+
+ @Override
+ public double getMethodParameter(String method, String key, double defaultValue) {
+ Number n = getCachedNumber(method, key);
+ if (n != null) {
+ return n.doubleValue();
+ }
+ String value = getMethodParameter(method, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ double d = Double.parseDouble(value);
+ updateCachedNumber(method, key, d);
+ return d;
+ }
+
+ @Override
+ public float getMethodParameter(String method, String key, float defaultValue) {
+ Number n = getCachedNumber(method, key);
+ if (n != null) {
+ return n.floatValue();
+ }
+ String value = getMethodParameter(method, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ float f = Float.parseFloat(value);
+ updateCachedNumber(method, key, f);
+ return f;
+ }
+
+ @Override
+ public long getMethodParameter(String method, String key, long defaultValue) {
+ Number n = getCachedNumber(method, key);
+ if (n != null) {
+ return n.longValue();
+ }
+ String value = getMethodParameter(method, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ long l = Long.parseLong(value);
+ updateCachedNumber(method, key, l);
+ return l;
+ }
+
+ @Override
+ public int getMethodParameter(String method, String key, int defaultValue) {
+ Number n = getCachedNumber(method, key);
+ if (n != null) {
+ return n.intValue();
+ }
+ String value = getMethodParameter(method, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ int i = Integer.parseInt(value);
+ updateCachedNumber(method, key, i);
+ return i;
+ }
+
+ @Override
+ public short getMethodParameter(String method, String key, short defaultValue) {
+ Number n = getCachedNumber(method, key);
+ if (n != null) {
+ return n.shortValue();
+ }
+ String value = getMethodParameter(method, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ short s = Short.parseShort(value);
+ updateCachedNumber(method, key, s);
+ return s;
+ }
+
+ @Override
+ public byte getMethodParameter(String method, String key, byte defaultValue) {
+ Number n = getCachedNumber(method, key);
+ if (n != null) {
+ return n.byteValue();
+ }
+ String value = getMethodParameter(method, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ byte b = Byte.parseByte(value);
+ updateCachedNumber(method, key, b);
+ return b;
+ }
+
+ @Override
+ public double getServiceParameter(String service, String key, double defaultValue) {
+ Number n = getServiceNumbers(service).get(key);
+ if (n != null) {
+ return n.doubleValue();
+ }
+ String value = getServiceParameter(service, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ double d = Double.parseDouble(value);
+ getNumbers().put(key, d);
+ return d;
+ }
+
+ @Override
+ public float getServiceParameter(String service, String key, float defaultValue) {
+ Number n = getServiceNumbers(service).get(key);
+ if (n != null) {
+ return n.floatValue();
+ }
+ String value = getServiceParameter(service, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ float f = Float.parseFloat(value);
+ getNumbers().put(key, f);
+ return f;
+ }
+
+ @Override
+ public long getServiceParameter(String service, String key, long defaultValue) {
+ Number n = getServiceNumbers(service).get(key);
+ if (n != null) {
+ return n.longValue();
+ }
+ String value = getServiceParameter(service, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ long l = Long.parseLong(value);
+ getNumbers().put(key, l);
+ return l;
+ }
+
+ @Override
+ public short getServiceParameter(String service, String key, short defaultValue) {
+ Number n = getServiceNumbers(service).get(key);
+ if (n != null) {
+ return n.shortValue();
+ }
+ String value = getServiceParameter(service, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ short s = Short.parseShort(value);
+ getNumbers().put(key, s);
+ return s;
+ }
+
+ @Override
+ public byte getServiceParameter(String service, String key, byte defaultValue) {
+ Number n = getServiceNumbers(service).get(key);
+ if (n != null) {
+ return n.byteValue();
+ }
+ String value = getServiceParameter(service, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ byte b = Byte.parseByte(value);
+ getNumbers().put(key, b);
+ return b;
+ }
+
+ @Override
+ public double getServiceMethodParameter(String service, String method, String key, double defaultValue) {
+ Number n = getCachedNumber(method, key);
+ if (n != null) {
+ return n.doubleValue();
+ }
+ String value = getServiceMethodParameter(service, method, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ double d = Double.parseDouble(value);
+ updateCachedNumber(method, key, d);
+ return d;
+ }
+
+ @Override
+ public float getServiceMethodParameter(String service, String method, String key, float defaultValue) {
+ Number n = getCachedNumber(method, key);
+ if (n != null) {
+ return n.floatValue();
+ }
+ String value = getServiceMethodParameter(service, method, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ float f = Float.parseFloat(value);
+ updateCachedNumber(method, key, f);
+ return f;
+ }
+
+ @Override
+ public long getServiceMethodParameter(String service, String method, String key, long defaultValue) {
+ Number n = getCachedNumber(method, key);
+ if (n != null) {
+ return n.longValue();
+ }
+ String value = getServiceMethodParameter(service, method, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ long l = Long.parseLong(value);
+ updateCachedNumber(method, key, l);
+ return l;
+ }
+
+ @Override
+ public int getServiceMethodParameter(String service, String method, String key, int defaultValue) {
+ Number n = getCachedNumber(method, key);
+ if (n != null) {
+ return n.intValue();
+ }
+ String value = getServiceMethodParameter(service, method, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ int i = Integer.parseInt(value);
+ updateCachedNumber(method, key, i);
+ return i;
+ }
+
+ @Override
+ public short getServiceMethodParameter(String service, String method, String key, short defaultValue) {
+ Number n = getCachedNumber(method, key);
+ if (n != null) {
+ return n.shortValue();
+ }
+ String value = getServiceMethodParameter(service, method, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ short s = Short.parseShort(value);
+ updateCachedNumber(method, key, s);
+ return s;
+ }
+
+ @Override
+ public byte getServiceMethodParameter(String service, String method, String key, byte defaultValue) {
+ Number n = getCachedNumber(method, key);
+ if (n != null) {
+ return n.byteValue();
+ }
+ String value = getServiceMethodParameter(service, method, key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ }
+ byte b = Byte.parseByte(value);
+ updateCachedNumber(method, key, b);
+ return b;
+ }
+
+
+ private Map<String, URL> getUrls() {
+ // concurrent initialization is tolerant
+ if (urls == null) {
+ urls = new ConcurrentHashMap<>();
+ }
+ return urls;
+ }
+
+ protected Map<String, Number> getNumbers() {
+ // concurrent initialization is tolerant
+ if (numbers == null) {
+ numbers = new ConcurrentHashMap<>();
+ }
+ return numbers;
+ }
+
+ private Number getCachedNumber(String method, String key) {
+ Map<String, Number> keyNumber = getMethodNumbers().get(method);
+ if (keyNumber != null) {
+ return keyNumber.get(key);
+ }
+ return null;
+ }
+
+ private void updateCachedNumber(String method, String key, Number n) {
+ Map<String, Number> keyNumber = getMethodNumbers().computeIfAbsent(method, m -> new HashMap<>());
+ keyNumber.put(key, n);
+ }
+
+ protected Map<String, Map<String, Number>> getMethodNumbers() {
+ if (methodNumbers == null) { // concurrent initialization is tolerant
+ methodNumbers = new ConcurrentHashMap<>();
+ }
+ return methodNumbers;
+ }
+
+ protected Map<String, Number> getServiceNumbers(String service) {
+ return getNumbers();
+ }
+
+ protected Map<String, Map<String, Number>> getServiceMethodNumbers(String service) {
+ return getMethodNumbers();
+ }
+
}
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/InstanceAddressURL.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/InstanceAddressURL.java
index 225b6e6e2e..3708991dc2 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/InstanceAddressURL.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/InstanceAddressURL.java
@@ -33,7 +33,6 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER;
import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;
@@ -51,8 +50,6 @@ public class InstanceAddressURL extends URL {
private final MetadataInfo metadataInfo;
// cached numbers
- private volatile transient Map<String, Number> numbers;
- private volatile transient Map<String, Map<String, Number>> methodNumbers;
private volatile transient Set<String> providerFirstParams;
// one instance address url serves only one protocol.
private final transient String protocol;
@@ -525,43 +522,6 @@ public class InstanceAddressURL extends URL {
throw new UnsupportedOperationException("URLAddress is replaced with ServiceInstance in instance url");
}
- @Override
- protected Map<String, Number> getServiceNumbers(String protocolServiceKey) {
- MetadataInfo.ServiceInfo serviceInfo = getServiceInfo(protocolServiceKey);
-
- return null == serviceInfo ? new ConcurrentHashMap<>() : serviceInfo.getNumbers();
- }
-
- @Override
- protected Map<String, Number> getNumbers() {
- String protocolServiceKey = getProtocolServiceKey();
- if (isEmpty(protocolServiceKey)) {
- if (numbers == null) { // concurrent initialization is tolerant
- numbers = new ConcurrentHashMap<>();
- }
- return numbers;
- }
- return getServiceNumbers(protocolServiceKey);
- }
-
- @Override
- protected Map<String, Map<String, Number>> getServiceMethodNumbers(String protocolServiceKey) {
- MetadataInfo.ServiceInfo serviceInfo = getServiceInfo(protocolServiceKey);
- return null == serviceInfo ? new ConcurrentHashMap<>() : serviceInfo.getMethodNumbers();
- }
-
- @Override
- protected Map<String, Map<String, Number>> getMethodNumbers() {
- String protocolServiceKey = getProtocolServiceKey();
- if (isEmpty(protocolServiceKey)) {
- if (methodNumbers == null) { // concurrent initialization is tolerant
- methodNumbers = new ConcurrentHashMap<>();
- }
- return methodNumbers;
- }
- return getServiceMethodNumbers(protocolServiceKey);
- }
-
private MetadataInfo.ServiceInfo getServiceInfo(String protocolServiceKey) {
return metadataInfo.getValidServiceInfo(protocolServiceKey);
}
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/OverrideInstanceAddressURL.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/OverrideInstanceAddressURL.java
index c02ef138e3..4791dceab4 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/OverrideInstanceAddressURL.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/OverrideInstanceAddressURL.java
@@ -31,7 +31,6 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
public class OverrideInstanceAddressURL extends InstanceAddressURL {
private static final long serialVersionUID = 1373220432794558426L;
@@ -39,11 +38,6 @@ public class OverrideInstanceAddressURL extends InstanceAddressURL {
private final URLParam overrideParams;
private final InstanceAddressURL originUrl;
- private final transient Map<String, Map<String, Map<String, Number>>> methodNumberCache = new ConcurrentHashMap<>();
- private volatile transient Map<String, Map<String, Number>> methodNumbers;
- private final transient Map<String, Map<String, Number>> serviceNumberCache = new ConcurrentHashMap<>();
- private volatile transient Map<String, Number> numbers;
-
public OverrideInstanceAddressURL(InstanceAddressURL originUrl) {
this.originUrl = originUrl;
this.overrideParams = URLParam.parse("");
@@ -240,32 +234,6 @@ public class OverrideInstanceAddressURL extends InstanceAddressURL {
return originUrl.getUrlAddress();
}
- @Override
- protected Map<String, Number> getServiceNumbers(String protocolServiceKey) {
- return serviceNumberCache.computeIfAbsent(protocolServiceKey, (k) -> new ConcurrentHashMap<>());
- }
-
- @Override
- protected Map<String, Number> getNumbers() {
- if (numbers == null) { // concurrent initialization is tolerant
- numbers = new ConcurrentHashMap<>();
- }
- return numbers;
- }
-
- @Override
- protected Map<String, Map<String, Number>> getServiceMethodNumbers(String protocolServiceKey) {
- return methodNumberCache.computeIfAbsent(protocolServiceKey, (k) -> new ConcurrentHashMap<>());
- }
-
- @Override
- protected Map<String, Map<String, Number>> getMethodNumbers() {
- if (methodNumbers == null) { // concurrent initialization is tolerant
- methodNumbers = new ConcurrentHashMap<>();
- }
- return methodNumbers;
- }
-
public URLParam getOverrideParams() {
return overrideParams;
}