package com.embracesource.config; import java.util.List; import java.util.concurrent.ConcurrentHashMap; /** * 动态配置文件辅助类的工厂类,在创建动态配置文件辅助类时,会订阅zk数据改变的事件 * @author june * */ public class DynamicPropertiesHelperFactory { private ConfigChangeSubscriber configChangeSubscriber; private ConcurrentHashMap<String, DynamicPropertiesHelper> helpers = new ConcurrentHashMap<String, DynamicPropertiesHelper>(); public DynamicPropertiesHelperFactory( ConfigChangeSubscriber configChangeSubscriber) { this.configChangeSubscriber = configChangeSubscriber; } public DynamicPropertiesHelper getHelper(String key) { DynamicPropertiesHelper helper = (DynamicPropertiesHelper) this.helpers .get(key); if (helper != null) { return helper; } return createHelper(key); } /** * * @param key zk中的一个节点 * @return */ private DynamicPropertiesHelper createHelper(String key) { List<String> keys = this.configChangeSubscriber.listKeys(); if ((keys == null) || (keys.size() == 0)) { return null; } if (!keys.contains(key)) { return null; } String initValue = this.configChangeSubscriber.getInitValue(key); final DynamicPropertiesHelper helper = new DynamicPropertiesHelper(initValue); DynamicPropertiesHelper old = (DynamicPropertiesHelper) this.helpers .putIfAbsent(key, helper); if (old != null) { return old; } /** * 订阅zk数据改变 */ this.configChangeSubscriber.subscribe(key, new ConfigChangeListener() { public void configChanged(String key, String value) { helper.refresh(value); } }); return helper; } }