package com.taobao.tddl.group.jdbc;
import com.taobao.tddl.common.model.ThreadLocalString;
import com.taobao.tddl.common.utils.thread.ThreadLocalMap;
import com.taobao.tddl.group.config.GroupIndex;
import com.taobao.tddl.group.dbselector.DBSelector;
/**
* @author yangzhu
*/
public class ThreadLocalDataSourceIndex {
public static boolean existsIndex() {
return getIndexAsObject() != null;
}
public static Integer getIndexAsObject() {
Integer indexObject = null;
try {
indexObject = (Integer) ThreadLocalMap.get(ThreadLocalString.DATASOURCE_INDEX);
if (indexObject == null) {
return null;
}
return indexObject;
} catch (Exception e) {
throw new IllegalArgumentException(msg(indexObject));
}
}
public static GroupIndex getIndex() {
Integer indexObject = null;
try {
indexObject = (Integer) ThreadLocalMap.get(ThreadLocalString.DATASOURCE_INDEX);
// 不存在索引时返回-1,这样调用者只要知道返回值是-1就会认为业务层没有设置过索引
if (indexObject == null) {
return new GroupIndex(DBSelector.NOT_EXIST_USER_SPECIFIED_INDEX, false);
}
int index = indexObject.intValue();
// 如果业务层已设置了索引,此时索引不能为负值
if (index < 0) {
throw new IllegalArgumentException(msg(indexObject));
}
boolean failRetryFlag = ThreadLocalDataSourceIndex.getFailRetryFlag();
return new GroupIndex(index, failRetryFlag);
} catch (Exception e) {
throw new IllegalArgumentException(msg(indexObject));
}
}
private static boolean getFailRetryFlag() {
Boolean failOver = (Boolean) ThreadLocalMap.get(ThreadLocalString.RETRY_IF_SET_DS_INDEX);
if (failOver == null) {
return false;
} else {
return failOver;
}
}
public static void clearIndex() {
ThreadLocalMap.remove(ThreadLocalString.DATASOURCE_INDEX);
ThreadLocalMap.remove(ThreadLocalString.RETRY_IF_SET_DS_INDEX);
}
private static String msg(Integer indexObject) {
return indexObject + " 不是一个有效的数据源索引,索引只能是大于0的数字";
}
}