package com.taobao.tddl.config.impl; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import com.taobao.tddl.config.ConfigDataHandler; import com.taobao.tddl.config.ConfigDataHandlerFactory; import com.taobao.tddl.config.ConfigDataListener; public class FileConfigDataHandlerFactory implements ConfigDataHandlerFactory { private String directory = ""; private String appName; private final static ConcurrentHashMap<String, ConfigDataHandler> filePath = new ConcurrentHashMap<String, ConfigDataHandler>(); public static final String configure_prefix = "com.taobao.tddl."; public FileConfigDataHandlerFactory(String directory, String appName, Executor executor){ super(); this.directory = directory; this.appName = appName; if (executor != null) { this.executor = executor; } else { this.executor = default_Executor; } } private Executor executor = null; private final static Executor default_Executor = Executors.newCachedThreadPool(new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread thd = new Thread(r); thd.setName("configure file checker"); return thd; } }); public String getDirectory() { return directory; } public void setDirectory(String directory) { this.directory = directory; } public Executor getExecutor() { return executor; } public void setExecutor(Executor executor) { this.executor = executor; } @Override public ConfigDataHandler getConfigDataHandler(String dataId, ConfigDataListener configDataListener) { String key = combineDataKey(appName, dataId); ConfigDataHandler configDataHandler = filePath.get(key); if (configDataHandler == null) { synchronized (this) { configDataHandler = filePath.get(key); // dcl if (configDataHandler == null) { configDataHandler = new FileConfigDataHandler(appName, executor, configure_prefix, directory, dataId, configDataListener); ConfigDataHandler tempCdh = filePath.putIfAbsent(key, configDataHandler); if (tempCdh != null) { configDataHandler = tempCdh; } } } } configDataHandler.addListener(configDataListener, null); return configDataHandler; } private final String combineDataKey(String appName, String dataId) { return appName + "_" + dataId; } @Override public ConfigDataHandler getConfigDataHandler(String dataId) { return null; } @Override public ConfigDataHandler getConfigDataHandler(String dataId, List<ConfigDataListener> configDataListenerList, Executor executor, Map<String, Object> config) { return null; } }