From a2161510daf259dc326db52e9201803044b771d0 Mon Sep 17 00:00:00 2001 From: liaozan <378024053@qq.com> Date: Sun, 9 Jul 2023 02:21:21 +0800 Subject: [PATCH] Add OnceApplicationContextEventListener --- .../DubboConfigInitEventListener.java | 28 +++++----- .../OnceApplicationContextEventListener.java | 56 +++++++++++++++++++ ...ultPropertiesEnvironmentPostProcessor.java | 2 +- 3 files changed, 71 insertions(+), 15 deletions(-) create mode 100644 support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/OnceApplicationContextEventListener.java diff --git a/starters/dubbo-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/dubbo/listener/DubboConfigInitEventListener.java b/starters/dubbo-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/dubbo/listener/DubboConfigInitEventListener.java index d396ae0..7c42ee2 100644 --- a/starters/dubbo-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/dubbo/listener/DubboConfigInitEventListener.java +++ b/starters/dubbo-spring-boot-starter/src/main/java/com/schbrain/framework/autoconfigure/dubbo/listener/DubboConfigInitEventListener.java @@ -1,5 +1,6 @@ package com.schbrain.framework.autoconfigure.dubbo.listener; +import com.schbrain.framework.support.spring.OnceApplicationContextEventListener; import org.apache.dubbo.config.ConfigCenterConfig; import org.apache.dubbo.config.context.ConfigManager; import org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor; @@ -7,9 +8,9 @@ import org.apache.dubbo.config.spring.context.event.DubboConfigInitEvent; import org.apache.dubbo.config.spring.util.DubboBeanUtils; import org.apache.dubbo.rpc.model.ApplicationModel; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.PriorityOrdered; +import org.springframework.core.env.ConfigurableEnvironment; import java.util.Map; @@ -20,33 +21,32 @@ import static org.apache.dubbo.config.spring.util.EnvironmentUtils.filterDubboPr * @see ReferenceAnnotationBeanPostProcessor#postProcessBeanFactory(ConfigurableListableBeanFactory) * @since 2023-05-08 */ -class DubboConfigInitEventListener implements ApplicationListener, PriorityOrdered { +class DubboConfigInitEventListener extends OnceApplicationContextEventListener implements PriorityOrdered { - private final ConfigurableApplicationContext applicationContext; + private final ConfigurableEnvironment environment; DubboConfigInitEventListener(ConfigurableApplicationContext applicationContext) { - this.applicationContext = applicationContext; + super(applicationContext); + this.environment = applicationContext.getEnvironment(); } @Override - public void onApplicationEvent(DubboConfigInitEvent event) { - if (event.getApplicationContext() == applicationContext) { - ApplicationModel applicationModel = DubboBeanUtils.getApplicationModel(applicationContext); - ConfigManager configManager = applicationModel.getApplicationConfigManager(); - configManager.addConfigCenter(buildConfigCenterConfig()); - } + public int getOrder() { + return HIGHEST_PRECEDENCE; } @Override - public int getOrder() { - return HIGHEST_PRECEDENCE; + protected void onEvent(DubboConfigInitEvent event) { + ApplicationModel applicationModel = DubboBeanUtils.getApplicationModel(getApplicationContext()); + ConfigManager configManager = applicationModel.getApplicationConfigManager(); + configManager.addConfigCenter(buildConfigCenterConfig()); } private ConfigCenterConfig buildConfigCenterConfig() { - Map externalConfiguration = filterDubboProperties(applicationContext.getEnvironment()); + Map externalConfiguration = filterDubboProperties(environment); ConfigCenterConfig configCenterConfig = new ConfigCenterConfig(); configCenterConfig.setAppExternalConfig(externalConfiguration); return configCenterConfig; } -} \ No newline at end of file +} diff --git a/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/OnceApplicationContextEventListener.java b/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/OnceApplicationContextEventListener.java new file mode 100644 index 0000000..112689d --- /dev/null +++ b/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/OnceApplicationContextEventListener.java @@ -0,0 +1,56 @@ +package com.schbrain.framework.support.spring; + +import org.springframework.beans.BeansException; +import org.springframework.boot.web.context.WebServerInitializedEvent; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ApplicationContextEvent; + +import static org.springframework.util.ObjectUtils.nullSafeEquals; + +/** + * 使用此类可以避免事件被处罚两次导致意外 + *

+ * 当类路径下存在 actuator,并且指定了不同端口的时候,实现了{@link ApplicationContextEvent}的事件会触发两次 + * + * @author liaozan + * @see org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration.DifferentManagementContextConfiguration#onApplicationEvent(WebServerInitializedEvent) + * @since 2023/7/9 + */ +@SuppressWarnings("JavadocReference") +public abstract class OnceApplicationContextEventListener implements ApplicationListener, ApplicationContextAware { + + private ApplicationContext applicationContext; + + public OnceApplicationContextEventListener() { + this(null); + } + + public OnceApplicationContextEventListener(ApplicationContext applicationContext) { + setApplicationContext(applicationContext); + } + + @Override + public void onApplicationEvent(E event) { + if (nullSafeEquals(getApplicationContext(), event.getSource())) { + onEvent(event); + } + } + + protected ApplicationContext getApplicationContext() { + if (applicationContext == null) { + throw new IllegalStateException("applicationContext must be not null"); + } + return applicationContext; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } + + protected abstract void onEvent(E event); + +} diff --git a/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/defaults/DefaultPropertiesEnvironmentPostProcessor.java b/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/defaults/DefaultPropertiesEnvironmentPostProcessor.java index e3ee069..f79b3ba 100644 --- a/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/defaults/DefaultPropertiesEnvironmentPostProcessor.java +++ b/support/schbrain-spring-support/src/main/java/com/schbrain/framework/support/spring/defaults/DefaultPropertiesEnvironmentPostProcessor.java @@ -62,7 +62,7 @@ public class DefaultPropertiesEnvironmentPostProcessor extends LoggerAwareEnviro defaultProperties.put("spring.mvc.throw-exception-if-no-handler-found", true); // datetime defaultProperties.put("spring.mvc.format.date", DatePattern.NORM_DATE_PATTERN); - defaultProperties.put("spring.mvc.format.time", DatePattern.NORM_TIME_FORMAT); + defaultProperties.put("spring.mvc.format.time", DatePattern.NORM_TIME_PATTERN); defaultProperties.put("spring.mvc.format.date-time", DatePattern.NORM_DATETIME_PATTERN); defaultProperties.put("spring.jackson.date-format", DatePattern.NORM_DATETIME_PATTERN); defaultProperties.put("spring.jackson.time-zone", TimeZone.getDefault()); -- GitLab