重构configParser

pull/120/head
weihu 3 years ago
parent cd402653f4
commit 100202fe07

@ -1,5 +1,6 @@
package cn.hippo4j.core.starter.config; package cn.hippo4j.core.starter.config;
import cn.hippo4j.core.starter.parser.ConfigFileTypeEnum;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
@ -38,7 +39,7 @@ public class BootstrapCoreProperties {
/** /**
* Config file type. * Config file type.
*/ */
private String configFileType; private ConfigFileTypeEnum configFileType;
/** /**
* Nacos config. * Nacos config.

@ -12,8 +12,8 @@ import cn.hippo4j.common.notify.platform.WeChatSendMessageHandler;
import cn.hippo4j.core.config.UtilAutoConfiguration; import cn.hippo4j.core.config.UtilAutoConfiguration;
import cn.hippo4j.core.executor.ThreadPoolNotifyAlarmHandler; import cn.hippo4j.core.executor.ThreadPoolNotifyAlarmHandler;
import cn.hippo4j.core.starter.notify.CoreNotifyConfigBuilder; import cn.hippo4j.core.starter.notify.CoreNotifyConfigBuilder;
import cn.hippo4j.core.starter.parser.ConfigParserHandler;
import cn.hippo4j.core.starter.refresher.ApolloRefresherHandler; import cn.hippo4j.core.starter.refresher.ApolloRefresherHandler;
import cn.hippo4j.core.starter.refresher.ConfigParserHandler;
import cn.hippo4j.core.starter.refresher.NacosCloudRefresherHandler; import cn.hippo4j.core.starter.refresher.NacosCloudRefresherHandler;
import cn.hippo4j.core.starter.refresher.NacosRefresherHandler; import cn.hippo4j.core.starter.refresher.NacosRefresherHandler;
import cn.hippo4j.core.starter.support.DynamicThreadPoolPostProcessor; import cn.hippo4j.core.starter.support.DynamicThreadPoolPostProcessor;
@ -102,32 +102,25 @@ public class DynamicThreadPoolCoreAutoConfiguration {
@ConditionalOnMissingClass(NACOS_CONFIG_MANAGER_KEY) @ConditionalOnMissingClass(NACOS_CONFIG_MANAGER_KEY)
public NacosRefresherHandler nacosRefresherHandler(ConfigService configService, public NacosRefresherHandler nacosRefresherHandler(ConfigService configService,
ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler, ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler,
ConfigParserHandler configParserHandler,
BootstrapCoreProperties bootstrapCoreProperties) { BootstrapCoreProperties bootstrapCoreProperties) {
return new NacosRefresherHandler(configService, threadPoolNotifyAlarmHandler, configParserHandler, bootstrapCoreProperties); return new NacosRefresherHandler(configService, threadPoolNotifyAlarmHandler, bootstrapCoreProperties);
} }
@Bean @Bean
@ConditionalOnClass(name = NACOS_CONFIG_MANAGER_KEY) @ConditionalOnClass(name = NACOS_CONFIG_MANAGER_KEY)
public NacosCloudRefresherHandler nacosCloudRefresherHandler(NacosConfigManager nacosConfigManager, public NacosCloudRefresherHandler nacosCloudRefresherHandler(NacosConfigManager nacosConfigManager,
ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler, ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler,
ConfigParserHandler configParserHandler,
BootstrapCoreProperties bootstrapCoreProperties) { BootstrapCoreProperties bootstrapCoreProperties) {
return new NacosCloudRefresherHandler(nacosConfigManager, threadPoolNotifyAlarmHandler, configParserHandler, bootstrapCoreProperties); return new NacosCloudRefresherHandler(nacosConfigManager, threadPoolNotifyAlarmHandler, bootstrapCoreProperties);
} }
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
@ConditionalOnClass(name = APOLLO_CONFIG_KEY) @ConditionalOnClass(name = APOLLO_CONFIG_KEY)
public ApolloRefresherHandler apolloRefresher(ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler, public ApolloRefresherHandler apolloRefresher(ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler,
ConfigParserHandler configParserHandler,
BootstrapCoreProperties bootstrapCoreProperties) { BootstrapCoreProperties bootstrapCoreProperties) {
return new ApolloRefresherHandler(threadPoolNotifyAlarmHandler, configParserHandler, bootstrapCoreProperties); return new ApolloRefresherHandler(threadPoolNotifyAlarmHandler, bootstrapCoreProperties);
} }
@Bean
public ConfigParserHandler configParserHandler() {
return new ConfigParserHandler();
}
} }

@ -0,0 +1,15 @@
package cn.hippo4j.core.starter.parser;
/**
* @author : wh
* @date : 2022/3/1 07:50
* @description:
*/
public abstract class AbstractConfigParser implements ConfigParser{
@Override
public boolean supports(ConfigFileTypeEnum type) {
return getConfigFileTypes().contains(type);
}
}

@ -0,0 +1,35 @@
package cn.hippo4j.core.starter.parser;
import lombok.Getter;
/**
* @author : wh
* @date : 2022/3/1 07:47
* @description:
*/
@Getter
public enum ConfigFileTypeEnum {
PROPERTIES("properties"),
XML("xml"),
JSON("json"),
YML("yml"),
YAML("yaml"),
TXT("txt");
private final String value;
ConfigFileTypeEnum(String value) {
this.value = value;
}
public static ConfigFileTypeEnum of(String value) {
for (ConfigFileTypeEnum typeEnum : ConfigFileTypeEnum.values()) {
if (typeEnum.value.equals(value)) {
return typeEnum;
}
}
return PROPERTIES;
}
}

@ -0,0 +1,20 @@
package cn.hippo4j.core.starter.parser;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* @author : wh
* @date : 2022/3/1 07:47
* @description:
*/
public interface ConfigParser {
boolean supports(ConfigFileTypeEnum type);
Map<Object, Object> doParse(String content) throws IOException;
List<ConfigFileTypeEnum> getConfigFileTypes();
}

@ -0,0 +1,47 @@
package cn.hippo4j.core.starter.parser;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;
/**
* @author : wh
* @date : 2022/3/1 08:02
* @description:
*/
public class ConfigParserHandler {
private static final List<ConfigParser> PARSERS = Lists.newArrayList();
private ConfigParserHandler() {
ServiceLoader<ConfigParser> loader = ServiceLoader.load(ConfigParser.class);
for (ConfigParser configParser : loader) {
PARSERS.add(configParser);
}
PARSERS.add(new PropertiesConfigParser());
PARSERS.add(new YamlConfigParser());
}
public Map<Object, Object> parseConfig(String content, ConfigFileTypeEnum type) throws IOException {
for (ConfigParser parser : PARSERS) {
if (parser.supports(type)) {
return parser.doParse(content);
}
}
return Collections.emptyMap();
}
public static ConfigParserHandler getInstance() {
return ConfigParserHandlerHolder.INSTANCE;
}
private static class ConfigParserHandlerHolder {
private static final ConfigParserHandler INSTANCE = new ConfigParserHandler();
}
}

@ -0,0 +1,30 @@
package cn.hippo4j.core.starter.parser;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.io.StringReader;
import java.util.List;
import java.util.Map;
import java.util.Properties;
/**
* @author : wh
* @date : 2022/3/1 07:49
* @description:
*/
public class PropertiesConfigParser extends AbstractConfigParser{
@Override
public Map<Object, Object> doParse(String content) throws IOException {
Properties properties = new Properties();
properties.load(new StringReader(content));
return properties;
}
@Override
public List<ConfigFileTypeEnum> getConfigFileTypes() {
return Lists.newArrayList(ConfigFileTypeEnum.PROPERTIES);
}
}

@ -0,0 +1,33 @@
package cn.hippo4j.core.starter.parser;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.Map;
/**
* @author : wh
* @date : 2022/3/1 07:57
* @description:
*/
public class YamlConfigParser extends AbstractConfigParser{
@Override
public Map<Object, Object> doParse(String content) {
if (StringUtils.isEmpty(content)) {
return Maps.newHashMapWithExpectedSize(0);
}
YamlPropertiesFactoryBean bean = new YamlPropertiesFactoryBean();
bean.setResources(new ByteArrayResource(content.getBytes()));
return bean.getObject();
}
@Override
public List<ConfigFileTypeEnum> getConfigFileTypes() {
return Lists.newArrayList(ConfigFileTypeEnum.YML, ConfigFileTypeEnum.YAML);
}
}

@ -9,6 +9,7 @@ import cn.hippo4j.core.executor.support.*;
import cn.hippo4j.core.proxy.RejectedProxyUtil; import cn.hippo4j.core.proxy.RejectedProxyUtil;
import cn.hippo4j.core.starter.config.BootstrapCoreProperties; import cn.hippo4j.core.starter.config.BootstrapCoreProperties;
import cn.hippo4j.core.starter.config.ExecutorProperties; import cn.hippo4j.core.starter.config.ExecutorProperties;
import cn.hippo4j.core.starter.parser.ConfigParserHandler;
import cn.hippo4j.core.starter.support.GlobalCoreThreadPoolManage; import cn.hippo4j.core.starter.support.GlobalCoreThreadPoolManage;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -17,6 +18,7 @@ import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.boot.context.properties.source.ConfigurationPropertySource; import org.springframework.boot.context.properties.source.ConfigurationPropertySource;
import org.springframework.boot.context.properties.source.MapConfigurationPropertySource; import org.springframework.boot.context.properties.source.MapConfigurationPropertySource;
import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@ -40,8 +42,6 @@ public abstract class AbstractCoreThreadPoolDynamicRefresh implements ThreadPool
private final ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler; private final ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler;
private final ConfigParserHandler configParserHandler;
protected final BootstrapCoreProperties bootstrapCoreProperties; protected final BootstrapCoreProperties bootstrapCoreProperties;
protected final ExecutorService dynamicRefreshExecutorService = ThreadPoolBuilder.builder() protected final ExecutorService dynamicRefreshExecutorService = ThreadPoolBuilder.builder()
@ -50,8 +50,15 @@ public abstract class AbstractCoreThreadPoolDynamicRefresh implements ThreadPool
.build(); .build();
@Override @Override
public void dynamicRefresh(String content) { public void dynamicRefresh(String content){
Map<Object, Object> configInfo = configParserHandler.parseConfig(content, bootstrapCoreProperties.getConfigFileType()); Map<Object, Object> configInfo = null;
try {
configInfo = ConfigParserHandler.getInstance().parseConfig(content, bootstrapCoreProperties.getConfigFileType());
} catch (IOException e) {
log.error("dynamic-thread-pool parse config file error, content: {}, fileType: {}",
content, bootstrapCoreProperties.getConfigFileType(), e);
return;
}
ConfigurationPropertySource sources = new MapConfigurationPropertySource(configInfo); ConfigurationPropertySource sources = new MapConfigurationPropertySource(configInfo);
Binder binder = new Binder(sources); Binder binder = new Binder(sources);

@ -26,14 +26,14 @@ public class ApolloRefresherHandler extends AbstractCoreThreadPoolDynamicRefresh
private String namespace; private String namespace;
public ApolloRefresherHandler(ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler, ConfigParserHandler configParserHandler, BootstrapCoreProperties bootstrapCoreProperties) { public ApolloRefresherHandler(ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler , BootstrapCoreProperties bootstrapCoreProperties) {
super(threadPoolNotifyAlarmHandler, configParserHandler, bootstrapCoreProperties); super(threadPoolNotifyAlarmHandler, bootstrapCoreProperties);
} }
@Override @Override
public void onChange(ConfigChangeEvent configChangeEvent) { public void onChange(ConfigChangeEvent configChangeEvent) {
ConfigFile configFile = ConfigService.getConfigFile(namespace, ConfigFile configFile = ConfigService.getConfigFile(namespace,
ConfigFileFormat.fromString(bootstrapCoreProperties.getConfigFileType())); ConfigFileFormat.fromString(bootstrapCoreProperties.getConfigFileType().getValue()));
String configInfo = configFile.getContent(); String configInfo = configFile.getContent();
dynamicRefresh(configInfo); dynamicRefresh(configInfo);
} }
@ -46,4 +46,5 @@ public class ApolloRefresherHandler extends AbstractCoreThreadPoolDynamicRefresh
config.addChangeListener(this); config.addChangeListener(this);
log.info("dynamic-thread-pool refresher, add apollo listener success, namespace: {}", namespace); log.info("dynamic-thread-pool refresher, add apollo listener success, namespace: {}", namespace);
} }
} }

@ -1,44 +0,0 @@
package cn.hippo4j.core.starter.refresher;
import cn.hippo4j.common.toolkit.StringUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.io.ByteArrayResource;
import java.util.List;
import java.util.Map;
/**
* Config parser service.
*
* @author chen.ma
* @date 2022/2/26 17:33
*/
public class ConfigParserHandler {
private final List<String> yamlList = Lists.newArrayList("yaml", "yml");
/**
* Parse config.
*
* @param content
* @param configFileType
* @return
*/
public Map<Object, Object> parseConfig(String content, String configFileType) {
Map<Object, Object> resultMap = Maps.newHashMap();
if (StringUtil.isBlank(content)) {
return resultMap;
}
if (yamlList.contains(configFileType)) {
YamlPropertiesFactoryBean yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean();
yamlPropertiesFactoryBean.setResources(new ByteArrayResource(content.getBytes()));
resultMap = yamlPropertiesFactoryBean.getObject();
}
return resultMap;
}
}

@ -23,9 +23,8 @@ public class NacosCloudRefresherHandler extends AbstractCoreThreadPoolDynamicRef
public NacosCloudRefresherHandler(NacosConfigManager nacosConfigManager, public NacosCloudRefresherHandler(NacosConfigManager nacosConfigManager,
ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler, ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler,
ConfigParserHandler configParserHandler,
BootstrapCoreProperties bootstrapCoreProperties) { BootstrapCoreProperties bootstrapCoreProperties) {
super(threadPoolNotifyAlarmHandler, configParserHandler, bootstrapCoreProperties); super(threadPoolNotifyAlarmHandler, bootstrapCoreProperties);
this.nacosConfigManager = nacosConfigManager; this.nacosConfigManager = nacosConfigManager;
} }

@ -23,9 +23,8 @@ public class NacosRefresherHandler extends AbstractCoreThreadPoolDynamicRefresh
public NacosRefresherHandler(ConfigService configService, public NacosRefresherHandler(ConfigService configService,
ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler, ThreadPoolNotifyAlarmHandler threadPoolNotifyAlarmHandler,
ConfigParserHandler configParserHandler,
BootstrapCoreProperties bootstrapCoreProperties) { BootstrapCoreProperties bootstrapCoreProperties) {
super(threadPoolNotifyAlarmHandler, configParserHandler, bootstrapCoreProperties); super(threadPoolNotifyAlarmHandler, bootstrapCoreProperties);
this.configService = configService; this.configService = configService;
} }

Loading…
Cancel
Save