package com.taobao.tddl.config.impl;
import java.util.List;
import java.util.concurrent.Executor;
import com.taobao.tddl.common.exception.TddlException;
import com.taobao.tddl.common.utils.TStringUtil;
import com.taobao.tddl.config.ConfigDataListener;
import com.taobao.tddl.config.impl.holder.ConfigHolderFactory;
import com.taobao.tddl.common.utils.logger.Logger;
import com.taobao.tddl.common.utils.logger.LoggerFactory;
/**
* 使用delegate模式,引入Preheat机制,允许预先构建cache,加速请求处理
*
* @author jianghang 2013-10-28 下午7:36:03
* @since 5.0.0
*/
public class PreheatDataHandler extends UnitConfigDataHandler {
private static final Logger logger = LoggerFactory.getLogger(PreheatDataHandler.class);
private UnitConfigDataHandler delagate;
@Override
public void doInit() throws TddlException {
delagate = loadHandlerExtension();
// 做一下数据预热
if (delagate.initialData == null && ConfigHolderFactory.isInit(delagate.getAppName())) {
delagate.initialData = ConfigHolderFactory.getConfigDataHolder(delagate.getAppName()).getData(dataId);
}
delagate.init();
}
@Override
public String getData(long timeout, String strategy) {
if (ConfigHolderFactory.isInit(delagate.getAppName())) {
String result = ConfigHolderFactory.getConfigDataHolder(delagate.getAppName()).getData(dataId);
if (!TStringUtil.isEmpty(result)) {
return result;
}
logger.error("PreheatDataHandler Miss Data, Use Default Handler. DataId Is : " + dataId);
}
return delagate.getData(timeout, strategy);
}
@Override
public String getNullableData(long timeout, String strategy) {
if (ConfigHolderFactory.isInit(delagate.getAppName())) {
return ConfigHolderFactory.getConfigDataHolder(delagate.getAppName()).getData(dataId);
}
return delagate.getNullableData(timeout, strategy);
}
@Override
public void addListener(ConfigDataListener configDataListener, Executor executor) {
delagate.addListener(configDataListener, executor);
}
@Override
public void addListeners(List<ConfigDataListener> configDataListenerList, Executor executor) {
delagate.addListeners(configDataListenerList, executor);
}
protected void doDestory() throws TddlException {
delagate.destory();
}
}