diff --git a/pom.xml b/pom.xml index 69d9b1295..211ea4103 100644 --- a/pom.xml +++ b/pom.xml @@ -330,12 +330,12 @@ - nexus-snapshots - https://oss.sonatype.org/content/repositories/snapshots/ + sctt-dev + https://mirrors.tencent.com/repository/maven/ScttDev - nexus-releases - https://oss.sonatype.org/service/local/staging/deploy/maven2/ + sctt-dev + https://mirrors.tencent.com/repository/maven/ScttDev diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigPropertyAutoRefresher.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigPropertyAutoRefresher.java index 71c13c8e3..f82642a37 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigPropertyAutoRefresher.java +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/adapter/PolarisConfigPropertyAutoRefresher.java @@ -117,7 +117,7 @@ public abstract class PolarisConfigPropertyAutoRefresher implements ApplicationL try { if (changedKey.startsWith("logging.level") && changedKey.length() >= 14) { String loggerName = changedKey.substring(14); - String newValue = (String) configPropertyChangeInfo.getNewValue(); + String newValue = (String) configPropertyChangeInfo.getNewValue().toString(); LOGGER.info("[SCT Config] set logging.level loggerName:{}, newValue:{}", loggerName, newValue); PolarisConfigLoggerContext.setLevel(loggerName, newValue); } diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/annotation/PolarisConfigAnnotationProcessor.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/annotation/PolarisConfigAnnotationProcessor.java index e8e245e51..85e1f2259 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/annotation/PolarisConfigAnnotationProcessor.java +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/annotation/PolarisConfigAnnotationProcessor.java @@ -27,6 +27,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Sets; import com.tencent.cloud.polaris.config.listener.ConfigChangeEvent; import com.tencent.cloud.polaris.config.listener.ConfigChangeListener; +import com.tencent.cloud.polaris.config.listener.SyncConfigChangeListener; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; @@ -90,8 +91,19 @@ public class PolarisConfigAnnotationProcessor implements BeanPostProcessor, Prio ReflectionUtils.makeAccessible(method); String[] annotatedInterestedKeys = annotation.interestedKeys(); String[] annotatedInterestedKeyPrefixes = annotation.interestedKeyPrefixes(); + boolean isAsync = annotation.async(); - ConfigChangeListener configChangeListener = changeEvent -> ReflectionUtils.invokeMethod(method, bean, changeEvent); + ConfigChangeListener configChangeListener = new SyncConfigChangeListener() { + @Override + public void onChange(ConfigChangeEvent changeEvent) { + ReflectionUtils.invokeMethod(method, bean, changeEvent); + } + + @Override + public boolean isAsync() { + return isAsync; + } + }; Set interestedKeys = annotatedInterestedKeys.length > 0 ? Sets.newHashSet(annotatedInterestedKeys) : null; diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/annotation/PolarisConfigKVFileChangeListener.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/annotation/PolarisConfigKVFileChangeListener.java index eba43e819..8517e774a 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/annotation/PolarisConfigKVFileChangeListener.java +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/annotation/PolarisConfigKVFileChangeListener.java @@ -54,4 +54,6 @@ public @interface PolarisConfigKVFileChangeListener { * @return interested key-prefixed in the listener */ String[] interestedKeyPrefixes() default {}; + + boolean async() default true; } diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/PolarisConfigListenerContext.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/PolarisConfigListenerContext.java index debefe712..0c2df3149 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/PolarisConfigListenerContext.java +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/PolarisConfigListenerContext.java @@ -72,11 +72,11 @@ public final class PolarisConfigListenerContext { /** * All custom interested keys defined in application . */ - private static final Map> interestedKeys = Maps.newHashMap(); + private static final Map> interestedKeys = Maps.newConcurrentMap(); /** * All custom interested key prefixes defined in application . */ - private static final Map> interestedKeyPrefixes = Maps.newHashMap(); + private static final Map> interestedKeyPrefixes = Maps.newConcurrentMap(); /** * Cache all latest configuration information for users in the application environment . */ @@ -89,7 +89,7 @@ public final class PolarisConfigListenerContext { * Get or Created new execute server . * @return execute service instance of {@link ExecutorService} */ - private static ExecutorService executor() { + public static ExecutorService executor() { if (EAR.get() == null) { synchronized (PolarisConfigListenerContext.class) { int coreThreadSize = Runtime.getRuntime().availableProcessors(); @@ -187,6 +187,15 @@ public final class PolarisConfigListenerContext { Map modifiedChanges = new HashMap<>(interestedChangedKeys.size()); interestedChangedKeys.parallelStream().forEach(key -> modifiedChanges.put(key, changes.get(key))); ConfigChangeEvent event = new ConfigChangeEvent(modifiedChanges, interestedChangedKeys); + + if (listener instanceof SyncConfigChangeListener) { + SyncConfigChangeListener l = (SyncConfigChangeListener) listener; + if (!l.isAsync()) { + listener.onChange(event); + continue; + } + } + PolarisConfigListenerContext.executor().execute(() -> listener.onChange(event)); } } diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/SyncConfigChangeListener.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/SyncConfigChangeListener.java new file mode 100644 index 000000000..a2bd194b3 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/SyncConfigChangeListener.java @@ -0,0 +1,7 @@ +package com.tencent.cloud.polaris.config.listener; + +public interface SyncConfigChangeListener extends ConfigChangeListener { + default boolean isAsync() { + return true; + } +} diff --git a/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/listener/ConfigChangeListenerTest.java b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/listener/ConfigChangeListenerTest.java index 562fe9d1b..7a0bd5b60 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/listener/ConfigChangeListenerTest.java +++ b/spring-cloud-starter-tencent-polaris-config/src/test/java/com/tencent/cloud/polaris/config/listener/ConfigChangeListenerTest.java @@ -18,14 +18,16 @@ package com.tencent.cloud.polaris.config.listener; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT; - import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import com.google.common.collect.Sets; +import com.tencent.cloud.polaris.config.annotation.PolarisConfigKVFileChangeListener; +import com.tencent.polaris.configuration.api.core.ConfigPropertyChangeInfo; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -36,9 +38,7 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.stereotype.Component; import org.springframework.test.context.junit.jupiter.SpringExtension; -import com.google.common.collect.Sets; -import com.tencent.cloud.polaris.config.annotation.PolarisConfigKVFileChangeListener; -import com.tencent.polaris.configuration.api.core.ConfigPropertyChangeInfo; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT; /** * Integration testing for change listener. @@ -104,7 +104,7 @@ public class ConfigChangeListenerTest { @PolarisConfigKVFileChangeListener(interestedKeys = {"timeout"}) public void configChangedListener(ConfigChangeEvent event) { ConfigPropertyChangeInfo changeInfo = event.getChange("timeout"); - timeout = Integer.parseInt((String)changeInfo.getNewValue()); + timeout = Integer.parseInt(changeInfo.getNewValue().toString()); changeCnt++; hits.countDown(); } @@ -112,7 +112,7 @@ public class ConfigChangeListenerTest { @PolarisConfigKVFileChangeListener(interestedKeyPrefixes = {"timeout"}) public void configChangedListener2(ConfigChangeEvent event) { ConfigPropertyChangeInfo changeInfo = event.getChange("timeout"); - timeout = Integer.parseInt((String)changeInfo.getNewValue()); + timeout = Integer.parseInt(changeInfo.getNewValue().toString()); changeCnt++; hits.countDown(); } diff --git a/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/PersonConfigChangeListener.java b/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/PersonConfigChangeListener.java index 150e25e20..108b22038 100644 --- a/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/PersonConfigChangeListener.java +++ b/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/PersonConfigChangeListener.java @@ -42,7 +42,25 @@ public final class PersonConfigChangeListener { Set changedKeys = event.changedKeys(); for (String changedKey : changedKeys) { - System.out.printf("%s = %s \n", changedKey, event.getChange(changedKey)); + System.out.printf("%s = %s , ThreadId: %s\n", changedKey, event.getChange(changedKey), Thread.currentThread().getId()); + } + } + + @PolarisConfigKVFileChangeListener(interestedKeyPrefixes = "teacher", async = false) + public void syncListen(ConfigChangeEvent event) { + Set changedKeys = event.changedKeys(); + + for (String changedKey : changedKeys) { + System.out.printf("%s = %s , ThreadId: %s\n", changedKey, event.getChange(changedKey), Thread.currentThread().getId()); + } + } + + @PolarisConfigKVFileChangeListener(interestedKeyPrefixes = "teacher", async = false) + public void syncListen2(ConfigChangeEvent event) { + Set changedKeys = event.changedKeys(); + + for (String changedKey : changedKeys) { + System.out.printf("%s = %s , ThreadId: %s\n", changedKey, event.getChange(changedKey), Thread.currentThread().getId()); } } }