From 0692c63025773fb5750600c707b57913018dd131 Mon Sep 17 00:00:00 2001 From: Melodyl-xyz Date: Tue, 8 Aug 2023 21:13:09 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E6=94=AF=E6=8C=81=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=88=86=E7=BB=84=E6=96=87=E4=BB=B6=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=8B=89=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 ++++---- .../PolarisConfigPropertyAutoRefresher.java | 2 +- .../PolarisConfigAnnotationProcessor.java | 14 ++++++++++++- .../PolarisConfigKVFileChangeListener.java | 2 ++ .../PolarisConfigListenerContext.java | 15 +++++++++++--- .../listener/SyncConfigChangeListener.java | 7 +++++++ .../listener/ConfigChangeListenerTest.java | 14 ++++++------- .../example/PersonConfigChangeListener.java | 20 ++++++++++++++++++- 8 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/SyncConfigChangeListener.java 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()); } } }