package com.taobao.tddl.repo.bdb.executor;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import com.taobao.tddl.common.exception.TddlException;
/**
* 读库选择器
*
* @author Whisper
*/
public class SlaveResourceSelector extends CommonResourceSelector {
// private static final Log logger =
// LogFactory.getLog(SlaveResourceSelector.class);
private final Random random = new Random();
protected final ArrayList<Integer> rExecutorList;
public SlaveResourceSelector(Integer executorSize, List<Integer> rWeight){
super(executorSize);
this.rExecutorList = new ArrayList<Integer>();
int rweightIndex = 0;
for (Integer exe : executorList) {
int weight = rWeight.get(rweightIndex);
for (int i = 0; i < weight; i++) {
rExecutorList.add(exe);
}
rweightIndex++;
}
}
@Override
public Integer select(Map<Integer, String> excludeKey) throws TddlException {
if (excludeKey == null) {
Integer commandExecutor = rExecutorList.get(random.nextInt(rExecutorList.size()));
return commandExecutor;
} else {
ArrayList<Integer> clone = removeExcludeKey(excludeKey);
int restSize = clone.size();
if (restSize == 0) {
throw new TddlException("No More selections ." + excludeKey);
}
int index = random.nextInt(restSize);
return clone.get(index);
}
}
@Override
public int getRetryTimes() {
return executorList.size();
}
}