package phoenix.datasource.davincicode; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.commons.lang3.Validate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.eventbus.EventBus; import lombok.Getter; import lombok.Setter; import phoenix.datasource.davincicode.datasource.DataSourceUnit; import phoenix.datasource.davincicode.model.ConfigItem; import phoenix.datasource.davincicode.model.Param; import phoenix.datasource.davincicode.util.NetTools; import phoenix.datasource.davincicode.util.NetTools.HttpResult; public class DataSourceManager implements InitializingBean { private static final Logger LOG = LoggerFactory.getLogger(DataSourceManager.class); private static final String PROTOCAL = "http://"; @Setter @Getter private String configServerAddress; private ExecutorService timerExecutor = Executors.newSingleThreadExecutor(); @Setter @Getter private long interval = 60 * 1000; private Map<String, ConfigItem> configs = Maps.newConcurrentMap(); @Setter @Getter private Map<String, DataSourceUnit> manage = Maps.newConcurrentMap(); private final EventBus eventBus = new EventBus("ConfigService-event-bus"); @Override public void afterPropertiesSet() throws Exception { Validate.notEmpty(configServerAddress); updateConfig(true); this.timerExecutor.submit(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(interval); updateConfig(false); } catch (Exception e) { LOG.error("Config Service Update Config Error :", e); } } } }); } private void updateConfig(boolean init) { HttpResult result = NetTools.httpPost(PROTOCAL + this.configServerAddress, buildParams()); System.out.println(buildParams()); Validate.isTrue(result.success); Map<String, ConfigItem> tc = JSON.parseObject(result.content, new TypeReference<Map<String, ConfigItem>>() { }); this.configs.putAll(tc); if (init) { for (Map.Entry<String, DataSourceUnit> v : manage.entrySet()) { eventBus.register(v.getValue()); } } this.eventBus.post(tc); } private String buildParams() { Map<String, Object> result = Maps.newHashMap(); List<Param> params = Lists.newArrayList(); for (Map.Entry<String, DataSourceUnit> me : manage.entrySet()) { long version = configs.containsKey(me.getKey()) ? configs.get(me.getKey()).getVersion() : 0; params.add(Param.builder().instanceIp(me.getValue().getInstanceIp()).dbName(me.getValue().getDbName()) .privilege(me.getValue().getPrivilege()).version(version).build()); } result.put("ip", NetTools.getLocalIP()); result.put("params", params); return JSON.toJSONString(result); } public void close() { this.timerExecutor.shutdown(); for (Map.Entry<String, DataSourceUnit> v : manage.entrySet()) { eventBus.unregister(v.getValue()); } } }