/** 从Diamond配置中心提取信息,构造TAtomDataSource、构造有优先级信息的读写DBSelector ---add by mazhidan.pt */ public void init() { // 警告: 不要在构造DefaultDiamondManager时就注册ManagerListener(比如:configReceiver) // 也就是说,不要这样用: new DefaultDiamondManager(dbGroupKey, configReceiver), // 而是要设成null,等第一次取得信息并解析完成后再注册,这样可以不用同步,避免任何与并发相关的问题, // 因为有可能在第一次刚取回信息后,Diamond配置中心那边马上修改了记录,导致ManagerListener这个线程立刻收到信息, // 造成初始化线程和ManagerListener线程同时解析信息。 configFactory = new DefaultConfigDataHandlerFactory(); globalHandler = configFactory.getConfigDataHandler(tGroupDataSource.getFullDbGroupKey(), null); String dsWeightCommaStr = globalHandler.getData( tGroupDataSource.getConfigReceiveTimeout(), ConfigDataHandler.FIRST_CACHE_THEN_SERVER_STRATEGY); // extra config extraFactory = new DefaultConfigDataHandlerFactory(); extraHandler = extraFactory.getConfigDataHandler(tGroupDataSource.getDbGroupExtraConfigKey(), null); String extraConfig = extraHandler.getData( tGroupDataSource.getConfigReceiveTimeout(), ConfigDataHandler.FIRST_CACHE_THEN_SERVER_STRATEGY); if (extraConfig != null) { parseExtraConfig(extraConfig); extraHandler.addListener(extraGroupConfigReceiver, null); } List<DataSourceWrapper> dswList = parse2DataSourceWrapperList(dsWeightCommaStr); resetByDataSourceWrapper(dswList); globalHandler.addListener(configReceiver, null); }
/** 根据普通的DataSource构造读写DBSelector */ public void init(List<DataSourceWrapper> dataSourceWrappers) { if ((dataSourceWrappers == null) || dataSourceWrappers.size() < 1) { throw new ConfigException("dataSourceWrappers不能为null且长度要大于0"); } createTAtomDataSource = false; // update(createDBSelectors2(dataSourceWrappers)); resetByDataSourceWrapper(dataSourceWrappers); }
// configInfo样例: db1:rw, db2:r, db3:r private void parse(String dsWeightCommaStr) { List<DataSourceWrapper> dswList = parse2DataSourceWrapperList(dsWeightCommaStr); resetByDataSourceWrapper(dswList); }