package com.sohu.cache.inspect.impl;
import com.sohu.cache.async.AsyncService;
import com.sohu.cache.async.KeyCallable;
import com.sohu.cache.async.NamedThreadFactory;
import com.sohu.cache.dao.InstanceDao;
import com.sohu.cache.entity.InstanceInfo;
import com.sohu.cache.inspect.InspectHandler;
import com.sohu.cache.inspect.InspectParamEnum;
import com.sohu.cache.inspect.Inspector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* Created by yijunzhang on 15-1-20.
*/
public abstract class AbstractInspectHandler implements InspectHandler {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
protected InstanceDao instanceDao;
protected AsyncService asyncService;
protected List<Inspector> inspectorList;
protected abstract String getThreadPoolKey();
protected abstract Map<String, List<InstanceInfo>> getSplitMap();
public void init() {
asyncService.assemblePool(getThreadPoolKey(), new ThreadPoolExecutor(5, 100,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024),
new NamedThreadFactory(getThreadPoolKey(), true)));
}
public void handle() {
if (inspectorList == null || inspectorList.isEmpty()) {
logger.warn("inspectorList is null");
return;
}
Map<String, List<InstanceInfo>> splitMap = getSplitMap();
for (Map.Entry<String, List<InstanceInfo>> entry : splitMap.entrySet()) {
String splitKey = entry.getKey();
List<InstanceInfo> instances = entry.getValue();
final Map<InspectParamEnum, Object> paramMap = new HashMap<InspectParamEnum, Object>();
paramMap.put(InspectParamEnum.SPLIT_KEY, splitKey);
paramMap.put(InspectParamEnum.INSTANCE_LIST, instances);
String key = getThreadPoolKey() + "-" + splitKey;
asyncService.submitFuture(getThreadPoolKey(), new KeyCallable<Boolean>(key) {
@Override
public Boolean execute() {
for (Inspector inspector : inspectorList) {
boolean isSuccess = false;
try {
isSuccess = inspector.inspect(paramMap);
} catch (Throwable e) {
logger.error(e.getMessage(), e);
}
if (!isSuccess) {
logger.error(getThreadPoolKey() + "-failed:" + inspector.getClass().getName());
return false;
}
}
return true;
}
});
}
}
public void setInspectorList(List<Inspector> inspectorList) {
this.inspectorList = inspectorList;
}
public List<InstanceInfo> getAllInstanceList() {
return instanceDao.getAllInsts();
}
public void setInstanceDao(InstanceDao instanceDao) {
this.instanceDao = instanceDao;
}
public void setAsyncService(AsyncService asyncService) {
this.asyncService = asyncService;
}
}