package com.taobao.tddl.matrix.config;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.taobao.tddl.common.TddlConstants;
import com.taobao.tddl.common.exception.TddlException;
import com.taobao.tddl.common.model.ExtraCmd;
import com.taobao.tddl.common.model.Group;
import com.taobao.tddl.common.model.Group.GroupType;
import com.taobao.tddl.common.model.Matrix;
import com.taobao.tddl.common.utils.GeneralUtil;
import com.taobao.tddl.config.impl.holder.AbstractConfigDataHolder;
import com.taobao.tddl.config.impl.holder.ConfigHolderFactory;
import com.taobao.tddl.executor.TopologyExecutor;
import com.taobao.tddl.executor.common.ExecutorContext;
import com.taobao.tddl.executor.common.TopologyHandler;
import com.taobao.tddl.optimizer.Optimizer;
import com.taobao.tddl.optimizer.OptimizerContext;
import com.taobao.tddl.optimizer.config.table.IndexManager;
import com.taobao.tddl.optimizer.config.table.SchemaManager;
import com.taobao.tddl.optimizer.config.table.StaticSchemaManager;
import com.taobao.tddl.optimizer.costbased.CostBasedOptimizer;
import com.taobao.tddl.optimizer.costbased.esitimater.stat.LocalStatManager;
import com.taobao.tddl.optimizer.costbased.esitimater.stat.StatManager;
import com.taobao.tddl.optimizer.rule.OptimizerRule;
import com.taobao.tddl.optimizer.rule.RuleIndexManager;
import com.taobao.tddl.optimizer.rule.RuleSchemaManager;
import com.taobao.tddl.rule.TddlRule;
/**
* 依赖的组件
*
* @since 5.0.0
*/
public class MatrixConfigHolder extends AbstractConfigDataHolder {
private static final String GROUP_CONFIG_HOLDER_NAME = "com.taobao.tddl.group.config.GroupConfigHolder";
private String appName;
private String ruleFilePath;
private boolean dynamicRule;
private String schemaFilePath;
private String topologyFilePath;
private String unitName;
private OptimizerRule optimizerRule;
private TopologyHandler topologyHandler;
private TopologyExecutor topologyExecutor;
private SchemaManager schemaManager;
private IndexManager indexManger;
private Optimizer optimizer;
private OptimizerContext optimizerContext;
private ExecutorContext executorContext;
private StatManager statManager;
private Matrix matrix;
private Map<String, Object> connectionProperties;
private boolean createGroupExecutor = true;
@Override
public void doInit() throws TddlException {
loadDelegateExtension();
ExecutorContext executorContext = new ExecutorContext();
this.executorContext = executorContext;
ExecutorContext.setContext(executorContext);
OptimizerContext oc = new OptimizerContext();
this.optimizerContext = oc;
OptimizerContext.setContext(oc);
topologyInit();
ruleInit();
schemaInit();
optimizerInit();
executorContext.setTopologyHandler(topologyHandler);
executorContext.setTopologyExecutor(topologyExecutor);
oc.setIndexManager(this.indexManger);
oc.setMatrix(topologyHandler.getMatrix());
oc.setSchemaManager(schemaManager);
oc.setRule(optimizerRule);
oc.setOptimizer(this.optimizer);
oc.setStatManager(this.statManager);
matrix = topologyHandler.getMatrix();
// 添加matrix参数
addDatas(matrix.getProperties());
initSonHolder();
// 将自己做为config holder
try {
ConfigHolderFactory.addConfigDataHolder(appName, this);
if (createGroupExecutor) {
initGroups();
}
} finally {
ConfigHolderFactory.removeConfigHoder(appName);
}
}
@Override
protected void doDestory() throws TddlException {
schemaManager.destory();
optimizerRule.destory();
optimizer.destory();
statManager.destory();
topologyHandler.destory();
topologyExecutor.destory();
}
public void topologyInit() throws TddlException {
topologyHandler = new TopologyHandler(appName, unitName, topologyFilePath);
topologyHandler.init();
topologyExecutor = new TopologyExecutor();
topologyExecutor.init();
}
public void ruleInit() throws TddlException {
TddlRule rule = new TddlRule();
rule.setAppName(appName);
rule.setAppRuleFile(ruleFilePath);
rule.init();
optimizerRule = new OptimizerRule(rule);
optimizerRule.init();
}
public void schemaInit() throws TddlException {
RuleSchemaManager ruleSchemaManager = new RuleSchemaManager(optimizerRule,
topologyHandler.getMatrix(),
GeneralUtil.getExtraCmdLong(this.connectionProperties,
ExtraCmd.TABLE_META_CACHE_EXPIRE_TIME,
TddlConstants.DEFAULT_TABLE_META_EXPIRE_TIME));
StaticSchemaManager staticSchemaManager = new StaticSchemaManager(schemaFilePath, appName, unitName);
ruleSchemaManager.setLocal(staticSchemaManager);
this.schemaManager = ruleSchemaManager;
schemaManager.init();
IndexManager indexManager = new RuleIndexManager(ruleSchemaManager);
indexManager.init();
this.indexManger = indexManager;
}
public void optimizerInit() throws TddlException {
CostBasedOptimizer optimizer = new CostBasedOptimizer();
optimizer.setExpireTime(GeneralUtil.getExtraCmdLong(this.connectionProperties,
ExtraCmd.OPTIMIZER_CACHE_EXPIRE_TIME,
TddlConstants.DEFAULT_OPTIMIZER_EXPIRE_TIME));
optimizer.init();
this.optimizer = optimizer;
// RuleStatManager statManager = new RuleStatManager(optimizerRule,
// topologyHandler.getMatrix());
LocalStatManager statManager = new LocalStatManager();
statManager.init();
this.statManager = statManager;
}
protected void initSonHolder() throws TddlException {
Class sonHolderClass = null;
try {
sonHolderClass = Class.forName(GROUP_CONFIG_HOLDER_NAME);
} catch (ClassNotFoundException e1) {
// ignore , 可能不需要使用group层
return;
}
try {
List<Group> groups = new ArrayList<Group>();
for (Group group : matrix.getGroups()) {
GroupType type = group.getType();
if (type.isMysql() || type.isOracle()) {
groups.add(group);
}
}
Constructor constructor = sonHolderClass.getConstructor(String.class, List.class, String.class);
sonConfigDataHolder = (AbstractConfigDataHolder) constructor.newInstance(this.appName,
groups,
this.unitName);
sonConfigDataHolder.init();
delegateDataHolder.setSonConfigDataHolder(sonConfigDataHolder);// 传递给deletegate,由它进行son传递
} catch (Exception e) {
throw new TddlException(e);
}
}
protected void initGroups() throws TddlException {
for (Group group : matrix.getGroups()) {
topologyHandler.createOne(group);
}
}
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public String getRuleFilePath() {
return ruleFilePath;
}
public void setRuleFilePath(String ruleFilePath) {
this.ruleFilePath = ruleFilePath;
}
public String getSchemaFilePath() {
return schemaFilePath;
}
public void setSchemaFilePath(String schemaFilePath) {
this.schemaFilePath = schemaFilePath;
}
public String getTopologyFilePath() {
return topologyFilePath;
}
public void setTopologyFilePath(String topologyFilePath) {
this.topologyFilePath = topologyFilePath;
}
public String getUnitName() {
return unitName;
}
public void setUnitName(String unitName) {
this.unitName = unitName;
}
public ExecutorContext getExecutorContext() {
return this.executorContext;
}
public OptimizerContext getOptimizerContext() {
return this.optimizerContext;
}
public Map<String, Object> getConnectionProperties() {
return connectionProperties;
}
public void setConnectionProperties(Map<String, Object> connectionProperties) {
this.connectionProperties = connectionProperties;
}
public boolean isDynamicRule() {
return dynamicRule;
}
public void setDynamicRule(boolean dynamicRule) {
this.dynamicRule = dynamicRule;
}
}