Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion example/example-apollo/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ apollo:
enabled: true
eagerLoad:
enabled: true
namespaces: dynamic-tp-apollo-demo-dtp.yml,application
namespaces: dynamic-tp-apollo-demo-dtp.yml,application,common-dtp.yml
meta: http://81.68.181.139:8080
app:
id: dynamic-tp-apollo-demo
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,13 @@
import com.ctrip.framework.apollo.model.ConfigFileChangeEvent;
import com.ctrip.framework.apollo.spring.config.PropertySourcesConstants;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.dromara.dynamictp.common.em.ConfigFileTypeEnum;
import org.dromara.dynamictp.common.properties.DtpProperties;
import org.dromara.dynamictp.core.handler.ConfigHandler;
Expand All @@ -35,6 +40,7 @@

import java.io.IOException;
import java.util.List;
import java.util.Map;

import static org.dromara.dynamictp.common.constant.DynamicTpConst.MAIN_PROPERTIES_PREFIX;

Expand All @@ -46,29 +52,46 @@
* @since 1.0.0
**/
@Slf4j
public class ApolloRefresher extends AbstractSpringRefresher implements ConfigFileChangeListener, InitializingBean {
public class ApolloRefresher extends AbstractSpringRefresher implements InitializingBean, ConfigFileChangeListener {

private static final Splitter NAMESPACE_SPLITTER = Splitter.on(",").omitEmptyStrings().trimResults();

private final List<Pair<String, ConfigFileFormat>> namespacePairList = Lists.newArrayList();

public ApolloRefresher(DtpProperties dtpProperties) {
super(dtpProperties);
}

@Override
public void onChange(ConfigFileChangeEvent changeEvent) {
String namespace = changeEvent.getNamespace();
String newValue = changeEvent.getNewValue();
ConfigFileTypeEnum configFileType = deduceConfigFileType(namespace);
refresh(newValue, configFileType);
val configHandler = ConfigHandler.getInstance();
val mergedProperties = Maps.newHashMap();
namespacePairList.forEach(pair -> {
String content;
if (changeEvent.getNamespace().startsWith(pair.getLeft())) {
content = changeEvent.getNewValue();
} else {
content = ConfigService.getConfigFile(pair.getLeft(), pair.getRight()).getContent();
}
if (StringUtils.isBlank(content)) {
return;
}
try {
Map<Object, Object> properties = configHandler.parseConfig(content, ConfigFileTypeEnum.of(pair.getRight().getValue()));
if (MapUtils.isNotEmpty(properties)) {
mergedProperties.putAll(properties);
}
} catch (IOException e) {
log.error("DynamicTp refresher, parse apollo config file error, namespace: {}", pair.getLeft(), e);
}
});
refresh(mergedProperties);
}

@Override
public void afterPropertiesSet() {
String namespaces = environment.getProperty(PropertySourcesConstants.APOLLO_BOOTSTRAP_NAMESPACES,
ConfigConsts.NAMESPACE_APPLICATION);
log.debug("Apollo bootstrap namespaces: {}", namespaces);
List<String> namespaceList = NAMESPACE_SPLITTER.splitToList(namespaces);

List<String> namespaceList = getNamespaceList();
log.info("Apollo bootstrap namespaces: {}", namespaceList);
for (String namespace : namespaceList) {
ConfigFileFormat format = determineFileFormat(namespace);
String actualNamespaceName = trimNamespaceFormat(namespace, format);
Expand All @@ -77,6 +100,7 @@ public void afterPropertiesSet() {
continue;
}
try {
namespacePairList.add(Pair.of(actualNamespaceName, format));
configFile.addChangeListener(this);
log.info("DynamicTp refresher, add listener success, namespace: {}", actualNamespaceName);
} catch (Exception e) {
Expand All @@ -103,9 +127,10 @@ private String trimNamespaceFormat(String namespaceName, ConfigFileFormat format
return namespaceName.substring(0, namespaceName.length() - extension.length());
}

private ConfigFileTypeEnum deduceConfigFileType(String namespace) {
ConfigFileFormat configFileFormat = determineFileFormat(namespace);
return ConfigFileTypeEnum.of(configFileFormat.getValue());
private List<String> getNamespaceList() {
String namespaces = environment.getProperty(PropertySourcesConstants.APOLLO_BOOTSTRAP_NAMESPACES,
ConfigConsts.NAMESPACE_APPLICATION);
return NAMESPACE_SPLITTER.splitToList(namespaces);
}

private boolean isDtpNamespace(String content, ConfigFileTypeEnum configFileType) {
Expand Down