[SCB-2253] reduce invoke setter when configuration changed for @InjectProperties
diff --git a/core/src/main/java/org/apache/servicecomb/core/exception/DefaultExceptionProcessor.java b/core/src/main/java/org/apache/servicecomb/core/exception/DefaultExceptionProcessor.java
index 724e8b0..e18f5e8 100644
--- a/core/src/main/java/org/apache/servicecomb/core/exception/DefaultExceptionProcessor.java
+++ b/core/src/main/java/org/apache/servicecomb/core/exception/DefaultExceptionProcessor.java
@@ -48,6 +48,8 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
@Component
@InjectProperties(prefix = "servicecomb.invocation.exception")
public class DefaultExceptionProcessor implements ExceptionProcessor {
@@ -55,6 +57,7 @@
public static final int ORDER = Integer.MAX_VALUE;
+ @JsonIgnore
@SuppressWarnings("unchecked")
private final List<ExceptionConverter<Throwable>> converters = SPIServiceUtils
.getOrLoadSortedService(ExceptionConverter.class).stream()
diff --git a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectProperty.java b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectProperty.java
index 7231999..e81465b 100644
--- a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectProperty.java
+++ b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectProperty.java
@@ -17,6 +17,8 @@
package org.apache.servicecomb.config.priority;
+import javax.annotation.Nullable;
+
import org.apache.servicecomb.foundation.common.utils.bean.Setter;
/**
@@ -32,7 +34,9 @@
this.property = property;
}
- public void updateValue(Object instance) {
- setter.set(instance, property.getValue());
+ public void updateValueWhenChanged(Object instance, @Nullable String changedKey) {
+ if (property.isChangedKey(changedKey)) {
+ setter.set(instance, property.getValue());
+ }
}
}
diff --git a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityProperty.java b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityProperty.java
index faad071..3af93c8 100644
--- a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityProperty.java
+++ b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityProperty.java
@@ -180,4 +180,19 @@
public T getValue() {
return finalValue;
}
+
+ public boolean isChangedKey(String changedKey) {
+ if (changedKey == null) {
+ // property source changed or clear, and so on
+ return true;
+ }
+
+ for (DynamicProperty property : properties) {
+ if (changedKey.equals(property.getName())) {
+ return true;
+ }
+ }
+
+ return false;
+ }
}
diff --git a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityPropertyManager.java b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityPropertyManager.java
index 7cf6eaf..15a1b5b 100644
--- a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityPropertyManager.java
+++ b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityPropertyManager.java
@@ -63,10 +63,12 @@
return;
}
- // just update all properties, it's very fast, no need to do any optimize
+ // just loop all properties, it's very fast, no need to do any optimize
for (Entry<Object, List<ConfigObjectProperty>> entry : configObjectMap.entrySet()) {
Object instance = entry.getKey();
- entry.getValue().forEach(configObjectProperty -> configObjectProperty.updateValue(instance));
+ entry.getValue()
+ .forEach(
+ configObjectProperty -> configObjectProperty.updateValueWhenChanged(instance, event.getPropertyName()));
}
}