From 7259998ff69732e167e77f35e621048f6762ccb7 Mon Sep 17 00:00:00 2001 From: shuiqingliu Date: Thu, 14 Sep 2023 11:19:05 +0800 Subject: [PATCH] fix: register a destroy hook when the application event trigger if we register a destroy hook for RemoteConfigFileRepo on the class instance , the static thread pool may be terminated by the bootstrap context closing ,Therefore,it's better to register the destroy hook when the application is prepared, or when the application fails to start, in order to properly destroy resources --- .../config/PolarisConfigAutoConfiguration.java | 7 ------- .../config/PolarisContextAutoConfiguration.java | 6 ++++++ .../PolarisContextApplicationEventListener.java | 13 ++++++++++--- 3 files changed, 16 insertions(+), 10 deletions(-) rename spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/PolarisConfigNonDaemonThreadStopListener.java => spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/listener/PolarisContextApplicationEventListener.java (70%) diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/PolarisConfigAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/PolarisConfigAutoConfiguration.java index 86396e38b..b0c212a14 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/PolarisConfigAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/PolarisConfigAutoConfiguration.java @@ -28,13 +28,11 @@ import com.tencent.cloud.polaris.config.annotation.PolarisConfigAnnotationProces import com.tencent.cloud.polaris.config.condition.ConditionalOnReflectRefreshType; import com.tencent.cloud.polaris.config.config.PolarisConfigProperties; import com.tencent.cloud.polaris.config.listener.PolarisConfigChangeEventListener; -import com.tencent.cloud.polaris.config.listener.PolarisConfigNonDaemonThreadStopListener; import com.tencent.cloud.polaris.config.listener.PolarisConfigRefreshOptimizationListener; import com.tencent.cloud.polaris.config.logger.PolarisConfigLoggerApplicationListener; import com.tencent.cloud.polaris.config.spring.annotation.SpringValueProcessor; import com.tencent.cloud.polaris.config.spring.property.PlaceholderHelper; import com.tencent.cloud.polaris.config.spring.property.SpringValueRegistry; -import com.tencent.cloud.polaris.context.PolarisSDKContextManager; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -65,11 +63,6 @@ public class PolarisConfigAutoConfiguration { return new PolarisConfigChangeEventListener(); } - @Bean - public PolarisConfigNonDaemonThreadStopListener polarisLongPullingStopListener(PolarisSDKContextManager polarisSDKContextManager) { - return new PolarisConfigNonDaemonThreadStopListener(polarisSDKContextManager); - } - @Bean public PolarisConfigLoggerApplicationListener polarisConfigLoggerApplicationListener() { return new PolarisConfigLoggerApplicationListener(); diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java index 1593fdd5f..febf139fd 100644 --- a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java @@ -25,6 +25,7 @@ import com.tencent.cloud.polaris.context.ModifyAddress; import com.tencent.cloud.polaris.context.PolarisConfigModifier; import com.tencent.cloud.polaris.context.PolarisSDKContextManager; import com.tencent.cloud.polaris.context.ServiceRuleManager; +import com.tencent.cloud.polaris.context.listener.PolarisContextApplicationEventListener; import com.tencent.polaris.api.exception.PolarisException; import com.tencent.polaris.client.api.SDKContext; @@ -58,4 +59,9 @@ public class PolarisContextAutoConfiguration { public ServiceRuleManager serviceRuleManager(PolarisSDKContextManager polarisSDKContextManager) { return new ServiceRuleManager(polarisSDKContextManager.getSDKContext(), polarisSDKContextManager.getConsumerAPI()); } + + @Bean + public PolarisContextApplicationEventListener polarisContextApplicationEventListener(PolarisSDKContextManager polarisSDKContextManager) { + return new PolarisContextApplicationEventListener(polarisSDKContextManager); + } } diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/PolarisConfigNonDaemonThreadStopListener.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/listener/PolarisContextApplicationEventListener.java similarity index 70% rename from spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/PolarisConfigNonDaemonThreadStopListener.java rename to spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/listener/PolarisContextApplicationEventListener.java index 58e3f66b6..0006f71b9 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/PolarisConfigNonDaemonThreadStopListener.java +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/listener/PolarisContextApplicationEventListener.java @@ -16,11 +16,13 @@ * */ -package com.tencent.cloud.polaris.config.listener; +package com.tencent.cloud.polaris.context.listener; import com.tencent.cloud.polaris.context.PolarisSDKContextManager; +import com.tencent.polaris.configuration.client.internal.RemoteConfigFileRepo; import org.springframework.boot.context.event.ApplicationFailedEvent; +import org.springframework.boot.context.event.ApplicationPreparedEvent; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.lang.NonNull; @@ -31,17 +33,22 @@ import org.springframework.lang.NonNull; * @author shuiqingliu * @since 2023/8/29 **/ -public class PolarisConfigNonDaemonThreadStopListener implements ApplicationListener { +public class PolarisContextApplicationEventListener implements ApplicationListener { private final PolarisSDKContextManager polarisSDKContextManager; - public PolarisConfigNonDaemonThreadStopListener(PolarisSDKContextManager polarisSDKContextManager) { + public PolarisContextApplicationEventListener(PolarisSDKContextManager polarisSDKContextManager) { this.polarisSDKContextManager = polarisSDKContextManager; } @Override public void onApplicationEvent(@NonNull ApplicationEvent event) { + if (event instanceof ApplicationPreparedEvent) { + RemoteConfigFileRepo.registerRepoDestroyHook(polarisSDKContextManager.getSDKContext()); + } + if (event instanceof ApplicationFailedEvent) { + RemoteConfigFileRepo.registerRepoDestroyHook(polarisSDKContextManager.getSDKContext()); //implicit invoke 'destroy' when the spring application fails to start, in order to stop non-daemon threads. polarisSDKContextManager.getSDKContext().destroy(); }