package com.alibaba.doris.common.adminservice;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.alibaba.doris.common.AdminServiceConstants;
import com.alibaba.doris.common.adminservice.connenctor.AdminConnector;
abstract public class BaseAdminService<T> {
private Log log = LogFactory.getLog(BaseAdminService.class);
private AdminConnector httpService = AdminConnector.getInstance();
private boolean lock = false;
private T result;
private long refreshTime = 500; // ms,该时间段内只访问admin server一次
private long accessTime; // ms,上次访问的timestamp
public synchronized T requestForce(Map<String, String> paramMap) {// 定时器使用该方法
access(paramMap);
return result;
}
public synchronized T requestRefresh(Map<String, String> paramMap) { // 正常请求调用,避免多线程强制刷新给admin
// server造成压力
if (!lock) {
lock = true;
access(paramMap);
accessTime = System.currentTimeMillis();
}
if ((System.currentTimeMillis() - accessTime) > refreshTime) {
access(paramMap);
lock = false;
}
return result;
}
private void access(Map<String, String> paramMap) {
if (paramMap == null) {
paramMap = new HashMap<String, String>();
}
if (StringUtils.isNotEmpty(getActionName())) {
paramMap.put(AdminServiceConstants.ADMIN_SERVICE_ACTION_NAME,
getActionName());
}
String response = httpService.requst(paramMap);
if (log.isDebugEnabled()) {
log.debug("access admin server-- request map:" + paramMap
+ " response:" + response);
}
if (AdminServiceConstants.ADMIN_SERVICE_ERROR.equals(response)) {
result = convert(null);
} else {
result = convert(response);
}
}
abstract public T convert(String response);
abstract public String getActionName();
}