本文主要研究一下dubbo的ConfigChangeEvent
dubbo-2.7.3/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigChangeEvent.java
public class ConfigChangeEvent { private final String key; private final String value; private final ConfigChangeType changeType; public ConfigChangeEvent(String key, String value) { this(key, value, ConfigChangeType.MODIFIED); } public ConfigChangeEvent(String key, String value, ConfigChangeType changeType) { this.key = key; this.value = value; this.changeType = changeType; } public String getKey() { return key; } public String getValue() { return value; } public ConfigChangeType getChangeType() { return changeType; } @Override public String toString() { return "ConfigChangeEvent{" + "key='" + key + '/'' + ", value='" + value + '/'' + ", changeType=" + changeType + '}'; } }
dubbo-2.7.3/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigChangeType.java
public enum ConfigChangeType { /** * A config is created. */ ADDED, /** * A config is updated. */ MODIFIED, /** * A config is deleted. */ DELETED }
dubbo-2.7.3/dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationListener.java
public interface ConfigurationListener { /** * Listener call back method. Listener gets notified by this method once there's any change happens on the config * the listener listens on. * * @param event config change event */ void process(ConfigChangeEvent event); }
dubbo-2.7.3/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java
public abstract class AbstractConfiguratorListener implements ConfigurationListener { private static final Logger logger = LoggerFactory.getLogger(AbstractConfiguratorListener.class); protected List<Configurator> configurators = Collections.emptyList(); protected final void initWith(String key) { DynamicConfiguration dynamicConfiguration = DynamicConfiguration.getDynamicConfiguration(); dynamicConfiguration.addListener(key, this); String rawConfig = dynamicConfiguration.getRule(key, DynamicConfiguration.DEFAULT_GROUP); if (!StringUtils.isEmpty(rawConfig)) { genConfiguratorsFromRawRule(rawConfig); } } @Override public void process(ConfigChangeEvent event) { if (logger.isInfoEnabled()) { logger.info("Notification of overriding rule, change type is: " + event.getChangeType() + ", raw config content is:/n " + event.getValue()); } if (event.getChangeType().equals(ConfigChangeType.DELETED)) { configurators.clear(); } else { if (!genConfiguratorsFromRawRule(event.getValue())) { return; } } notifyOverrides(); } private boolean genConfiguratorsFromRawRule(String rawConfig) { boolean parseSuccess = true; try { // parseConfigurators will recognize app/service config automatically. configurators = Configurator.toConfigurators(ConfigParser.parseConfigurators(rawConfig)) .orElse(configurators); } catch (Exception e) { logger.error("Failed to parse raw dynamic config and it will not take effect, the raw config is: " + rawConfig, e); parseSuccess = false; } return parseSuccess; } protected abstract void notifyOverrides(); public List<Configurator> getConfigurators() { return configurators; } public void setConfigurators(List<Configurator> configurators) { this.configurators = configurators; } }
ConfigChangeEvent定义了key、value、changeType三个属性;ConfigChangeType定义了ADDED、MODIFIED、DELETED三种类型;ConfigurationListener定义了process方法来处理ConfigChangeEvent