Commit a2161510 authored by liaozan's avatar liaozan 🏀

Add OnceApplicationContextEventListener

parent e212b712
package com.schbrain.framework.autoconfigure.dubbo.listener; 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.ConfigCenterConfig;
import org.apache.dubbo.config.context.ConfigManager; import org.apache.dubbo.config.context.ConfigManager;
import org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor; import org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor;
...@@ -7,9 +8,9 @@ import org.apache.dubbo.config.spring.context.event.DubboConfigInitEvent; ...@@ -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.config.spring.util.DubboBeanUtils;
import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.model.ApplicationModel;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.PriorityOrdered; import org.springframework.core.PriorityOrdered;
import org.springframework.core.env.ConfigurableEnvironment;
import java.util.Map; import java.util.Map;
...@@ -20,30 +21,29 @@ import static org.apache.dubbo.config.spring.util.EnvironmentUtils.filterDubboPr ...@@ -20,30 +21,29 @@ import static org.apache.dubbo.config.spring.util.EnvironmentUtils.filterDubboPr
* @see ReferenceAnnotationBeanPostProcessor#postProcessBeanFactory(ConfigurableListableBeanFactory) * @see ReferenceAnnotationBeanPostProcessor#postProcessBeanFactory(ConfigurableListableBeanFactory)
* @since 2023-05-08 * @since 2023-05-08
*/ */
class DubboConfigInitEventListener implements ApplicationListener<DubboConfigInitEvent>, PriorityOrdered { class DubboConfigInitEventListener extends OnceApplicationContextEventListener<DubboConfigInitEvent> implements PriorityOrdered {
private final ConfigurableApplicationContext applicationContext; private final ConfigurableEnvironment environment;
DubboConfigInitEventListener(ConfigurableApplicationContext applicationContext) { DubboConfigInitEventListener(ConfigurableApplicationContext applicationContext) {
this.applicationContext = applicationContext; super(applicationContext);
this.environment = applicationContext.getEnvironment();
} }
@Override @Override
public void onApplicationEvent(DubboConfigInitEvent event) { public int getOrder() {
if (event.getApplicationContext() == applicationContext) { return HIGHEST_PRECEDENCE;
ApplicationModel applicationModel = DubboBeanUtils.getApplicationModel(applicationContext);
ConfigManager configManager = applicationModel.getApplicationConfigManager();
configManager.addConfigCenter(buildConfigCenterConfig());
}
} }
@Override @Override
public int getOrder() { protected void onEvent(DubboConfigInitEvent event) {
return HIGHEST_PRECEDENCE; ApplicationModel applicationModel = DubboBeanUtils.getApplicationModel(getApplicationContext());
ConfigManager configManager = applicationModel.getApplicationConfigManager();
configManager.addConfigCenter(buildConfigCenterConfig());
} }
private ConfigCenterConfig buildConfigCenterConfig() { private ConfigCenterConfig buildConfigCenterConfig() {
Map<String, String> externalConfiguration = filterDubboProperties(applicationContext.getEnvironment()); Map<String, String> externalConfiguration = filterDubboProperties(environment);
ConfigCenterConfig configCenterConfig = new ConfigCenterConfig(); ConfigCenterConfig configCenterConfig = new ConfigCenterConfig();
configCenterConfig.setAppExternalConfig(externalConfiguration); configCenterConfig.setAppExternalConfig(externalConfiguration);
return configCenterConfig; return configCenterConfig;
......
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;
/**
* 使用此类可以避免事件被处罚两次导致意外
* <p>
* 当类路径下存在 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<E extends ApplicationEvent> implements ApplicationListener<E>, 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);
}
...@@ -62,7 +62,7 @@ public class DefaultPropertiesEnvironmentPostProcessor extends LoggerAwareEnviro ...@@ -62,7 +62,7 @@ public class DefaultPropertiesEnvironmentPostProcessor extends LoggerAwareEnviro
defaultProperties.put("spring.mvc.throw-exception-if-no-handler-found", true); defaultProperties.put("spring.mvc.throw-exception-if-no-handler-found", true);
// datetime // datetime
defaultProperties.put("spring.mvc.format.date", DatePattern.NORM_DATE_PATTERN); 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.mvc.format.date-time", DatePattern.NORM_DATETIME_PATTERN);
defaultProperties.put("spring.jackson.date-format", DatePattern.NORM_DATETIME_PATTERN); defaultProperties.put("spring.jackson.date-format", DatePattern.NORM_DATETIME_PATTERN);
defaultProperties.put("spring.jackson.time-zone", TimeZone.getDefault()); defaultProperties.put("spring.jackson.time-zone", TimeZone.getDefault());
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment