package com.cwa.util.dynamic.property; import java.util.HashMap; import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; /** * 动态属性管理器。 */ public class DynamicPropertyManager { private static Logger logger = Logger.getLogger(DynamicPropertyManager.class); // 单例 private static final DynamicPropertyManager INSTANCE = new DynamicPropertyManager(); public static DynamicPropertyManager getInstance() { return INSTANCE; } private final Map<String, DynamicProperty> propMap; private ScheduledExecutorService executorService; private DynamicPropertyManager() { propMap = new HashMap<String, DynamicProperty>(); executorService = Executors.newScheduledThreadPool(1); executorService.scheduleAtFixedRate(new Runnable() { @Override public void run() { refresh(); } }, 1, // initialDelay 1分钟 1, // period 1分钟 TimeUnit.MINUTES); } /** * 注册动态属性。 * @param key * @param refreshPeriodSecond * @param prop */ public void register(String key, long refreshPeriodSecond, DynamicProperty prop) { if (key == null || key.trim().isEmpty()) { throw new IllegalArgumentException("Invalid key: " + key); } if (refreshPeriodSecond <= 0) { throw new IllegalArgumentException("Invalid refresh period:" + refreshPeriodSecond); } if (prop == null) { throw new IllegalArgumentException("Dynamic property is null."); } try { prop.setRefreshRate(refreshPeriodSecond * 1000); prop.refresh(); prop.setLastRefresh(System.currentTimeMillis()); } catch (Exception e) { throw new RuntimeException("Can not initialize dynamic property", e); } synchronized (propMap) { if (propMap.containsKey(key)) { throw new IllegalArgumentException("Dynamic property with key " + key + " already registered."); } propMap.put(key, prop); } } // 刷新动态属性 private void refresh() { long now = System.currentTimeMillis(); for (String key : propMap.keySet()) { DynamicProperty prop = propMap.get(key); if (now - prop.getLastRefresh() > prop.getRefreshRate()) { prop.setLastRefresh(now); try { prop.refresh(); } catch (Exception e) { logger.error("Error refresh dynamic property: " + key, e); } } } } /** * 返回动态属性的值。 * @param key * @return */ public String getStringValue(String key) { return propMap.get(key).getValue(); } public boolean getBooleanValue(String key) { return Boolean.parseBoolean(getStringValue(null)); } public int getIntValue(String key) { return Integer.parseInt(getStringValue(null)); } public long getLongValue(String key) { return Long.parseLong(getStringValue(null)); } }