From 19d2854dd8fff6792998f2cf344413387d417268 Mon Sep 17 00:00:00 2001 From: qingliu Date: Wed, 20 Sep 2023 11:20:25 +0800 Subject: [PATCH 1/2] fix: change the timing of sdk context destruction. (#1125) --- .../PolarisConfigAutoConfiguration.java | 7 ------ .../PolarisContextAutoConfiguration.java | 6 +++++ ...olarisContextApplicationEventListener.java | 23 ++++++------------- 3 files changed, 13 insertions(+), 23 deletions(-) rename spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/PolarisConfigApplicationEventListener.java => spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/listener/PolarisContextApplicationEventListener.java (66%) 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 779e29751..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 @@ -27,14 +27,12 @@ import com.tencent.cloud.polaris.config.annotation.PolarisConfigAnnotationProcessor; import com.tencent.cloud.polaris.config.condition.ConditionalOnReflectRefreshType; import com.tencent.cloud.polaris.config.config.PolarisConfigProperties; -import com.tencent.cloud.polaris.config.listener.PolarisConfigApplicationEventListener; import com.tencent.cloud.polaris.config.listener.PolarisConfigChangeEventListener; 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; @@ -122,10 +120,5 @@ public PolarisConfigRefreshScopeAnnotationDetector polarisConfigRefreshScopeAnno public PolarisConfigRefreshOptimizationListener polarisConfigRefreshOptimizationListener() { return new PolarisConfigRefreshOptimizationListener(); } - - @Bean - public PolarisConfigApplicationEventListener polarisContextApplicationEventListener(PolarisSDKContextManager polarisSDKContextManager) { - return new PolarisConfigApplicationEventListener(polarisSDKContextManager); - } } } 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..080b0bf4f 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.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 ModifyAddress polarisConfigModifier(PolarisContextProperties properties) public ServiceRuleManager serviceRuleManager(PolarisSDKContextManager polarisSDKContextManager) { return new ServiceRuleManager(polarisSDKContextManager.getSDKContext(), polarisSDKContextManager.getConsumerAPI()); } + + @Bean + public PolarisContextApplicationEventListener contextApplicationEventListener(PolarisSDKContextManager polarisSDKContextManager) { + return new PolarisContextApplicationEventListener(polarisSDKContextManager); + } } diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/PolarisConfigApplicationEventListener.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/listener/PolarisContextApplicationEventListener.java similarity index 66% rename from spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/PolarisConfigApplicationEventListener.java rename to spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/listener/PolarisContextApplicationEventListener.java index 68106382c..ae753045c 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/listener/PolarisConfigApplicationEventListener.java +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/listener/PolarisContextApplicationEventListener.java @@ -16,42 +16,33 @@ * */ -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; -/* - * Polaris config non-daemon thread stop listener - * - * @author shuiqingliu - * @since 2023/8/29 +/** + * @author frankjlli + * @since 2023/9/18 **/ -public class PolarisConfigApplicationEventListener implements ApplicationListener { + +public class PolarisContextApplicationEventListener implements ApplicationListener { private final PolarisSDKContextManager polarisSDKContextManager; - public PolarisConfigApplicationEventListener(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(); } } - } From 22fab2bd82129ef17b1ea2b8121536eae3a2da2c Mon Sep 17 00:00:00 2001 From: wenxuan70 Date: Fri, 22 Sep 2023 09:42:54 +0800 Subject: [PATCH 2/2] feat: support log path configuration parameters (#1130) --- CHANGELOG.md | 1 + .../PolarisLoggingApplicationListener.java | 19 ++++++++ ...itional-spring-configuration-metadata.json | 6 +++ .../PolarisLoggingPathPropertyTest.java | 43 ++++++++++++++++++ .../PolarisLoggingPathSystemPropertyTest.java | 44 +++++++++++++++++++ .../src/test/resources/bootstrap.yml | 2 + 6 files changed, 115 insertions(+) create mode 100644 spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingPathPropertyTest.java create mode 100644 spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingPathSystemPropertyTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 465d2199f..330def12f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,3 +4,4 @@ - [fix:the polaris config relation non-daemon thread should stop when application fails to start.](https://github.com/Tencent/spring-cloud-tencent/pull/1101) - [Refactoring:remove invalid @AutoConfigureAfter and @AutoConfigureBefore from discovery client automatic configuration.](https://github.com/Tencent/spring-cloud-tencent/pull/1117) - [fix:fix feign url bug when using sleuth.](https://github.com/Tencent/spring-cloud-tencent/pull/1121) +- [feat: support log path configuration parameters.](https://github.com/Tencent/spring-cloud-tencent/pull/1130) \ No newline at end of file diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingApplicationListener.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingApplicationListener.java index a75087ec7..d01ef8a7f 100644 --- a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingApplicationListener.java +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingApplicationListener.java @@ -16,6 +16,8 @@ */ package com.tencent.cloud.polaris.context.logging; +import com.tencent.polaris.api.utils.StringUtils; +import com.tencent.polaris.logging.LoggingConsts; import com.tencent.polaris.logging.PolarisLogging; import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; @@ -24,6 +26,7 @@ import org.springframework.context.ApplicationEvent; import org.springframework.context.event.GenericApplicationListener; import org.springframework.core.ResolvableType; +import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.lang.NonNull; /** @@ -52,6 +55,22 @@ public int getOrder() { @Override public void onApplicationEvent(@NonNull ApplicationEvent applicationEvent) { + ConfigurableEnvironment environment = null; + + if (ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(applicationEvent.getClass())) { + environment = ((ApplicationEnvironmentPreparedEvent) applicationEvent).getEnvironment(); + } + else if (ApplicationFailedEvent.class.isAssignableFrom(applicationEvent.getClass())) { + environment = ((ApplicationFailedEvent) applicationEvent).getApplicationContext().getEnvironment(); + } + + if (environment != null) { + String loggingPath = environment.getProperty("spring.cloud.polaris.logging.path"); + if (StringUtils.isNotBlank(loggingPath)) { + System.setProperty(LoggingConsts.LOGGING_PATH_PROPERTY, loggingPath); + } + } + PolarisLogging.getInstance().loadConfiguration(); } } diff --git a/spring-cloud-tencent-polaris-context/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-tencent-polaris-context/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 5c0ddb2da..f3244d1fd 100644 --- a/spring-cloud-tencent-polaris-context/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-tencent-polaris-context/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -45,6 +45,12 @@ "type": "java.lang.Integer", "defaultValue": "", "description": "current server local port to be registered." + }, + { + "name": "spring.cloud.polaris.logging.path", + "type": "java.lang.String", + "defaultValue": "./polaris/logs", + "description": "polaris log storage path." } ], "hints": [] diff --git a/spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingPathPropertyTest.java b/spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingPathPropertyTest.java new file mode 100644 index 000000000..c936f1e42 --- /dev/null +++ b/spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingPathPropertyTest.java @@ -0,0 +1,43 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package com.tencent.cloud.polaris.context.logging; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.test.context.runner.ApplicationContextRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Test to get spring.cloud.polaris.logging.path from environment. + * + * @author wenxuan70 + */ +public class PolarisLoggingPathPropertyTest { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withPropertyValues("spring.cloud.polaris.logging.path=/tmp/polaris/logs"); + + @Test + public void testGetPropertyFromEnvironment() { + contextRunner.run(context -> { + String loggingPath = context.getEnvironment().getProperty("spring.cloud.polaris.logging.path"); + assertThat(loggingPath).isEqualTo("/tmp/polaris/logs"); + }); + } +} diff --git a/spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingPathSystemPropertyTest.java b/spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingPathSystemPropertyTest.java new file mode 100644 index 000000000..039c5c661 --- /dev/null +++ b/spring-cloud-tencent-polaris-context/src/test/java/com/tencent/cloud/polaris/context/logging/PolarisLoggingPathSystemPropertyTest.java @@ -0,0 +1,44 @@ +/* + * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. + * + * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package com.tencent.cloud.polaris.context.logging; + +import com.tencent.cloud.polaris.context.PolarisContextApplication; +import com.tencent.polaris.logging.LoggingConsts; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Test for {@link PolarisLoggingApplicationListener} + * + * @author wenxuan70 + */ +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = PolarisContextApplication.class, + properties = {"spring.config.location=classpath:bootstrap.yml"}) +public class PolarisLoggingPathSystemPropertyTest { + + @Test + public void testSystemProperty() { + assertThat(System.getProperty(LoggingConsts.LOGGING_PATH_PROPERTY)).isEqualTo("/tmp/polaris/logs"); + } +} diff --git a/spring-cloud-tencent-polaris-context/src/test/resources/bootstrap.yml b/spring-cloud-tencent-polaris-context/src/test/resources/bootstrap.yml index c445dd227..3339e6934 100644 --- a/spring-cloud-tencent-polaris-context/src/test/resources/bootstrap.yml +++ b/spring-cloud-tencent-polaris-context/src/test/resources/bootstrap.yml @@ -7,3 +7,5 @@ spring: service: TestApp enabled: true local-port: 9090 + logging: + path: /tmp/polaris/logs \ No newline at end of file