package com.meidusa.amoeba.context;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.meidusa.amoeba.exception.InitialisationException;
import com.meidusa.amoeba.util.Initialisable;
public class RuntimeContext implements Initialisable {
private String serverCharset;
// 没有实际用到
private Executor readExecutor;
// 应用端和amoeba端处理线程池
private ThreadPoolExecutor clientSideExecutor;
// amoeba和数据库实例处理线程池
private Executor serverSideExecutor;
// 用于定时更新ip访问规则的executor
private ScheduledExecutorService ipSyncExecutor;
private int readThreadPoolSize = 16;
private int clientSideThreadPoolSize = 16;
private int serverSideThreadPoolSize = 16;
// 最多允许多少个请求等待,否则告警
private int maxQueueSize = 100;
// 最多允许多少个超时请求
private int maxConnTimeOutCount = 100;
// 处理超时时间,单位为秒
private int queryTimeout = 60;
private boolean useMultipleThread = true;
// 后端验证超时时间,单位为秒
private long authTimeOut = 15;
private boolean autocommit = true;
private int isolationLevel = 8;
/**
* max result --Overload protection , query session was killed , results returned size exceed
*/
private int maxResult = -1;
public int getQueryTimeout() {
return queryTimeout;
}
public void setQueryTimeout(int queryTimeout) {
this.queryTimeout = queryTimeout;
}
public long getAuthTimeOut() {
return authTimeOut;
}
public void setAuthTimeOut(long authTimeOut) {
this.authTimeOut = authTimeOut;
}
public boolean isUseMultipleThread() {
return useMultipleThread;
}
public void setUseMultipleThread(boolean useMultipleThread) {
this.useMultipleThread = useMultipleThread;
}
public String getServerCharset() {
return serverCharset;
}
public Executor getReadExecutor() {
return readExecutor;
}
public void setReadExecutor(Executor readExecutor) {
this.readExecutor = readExecutor;
}
public ThreadPoolExecutor getClientSideExecutor() {
return clientSideExecutor;
}
public void setClientSideExecutor(ThreadPoolExecutor clientSideExecutor) {
this.clientSideExecutor = clientSideExecutor;
}
public Executor getServerSideExecutor() {
return serverSideExecutor;
}
public void setServerSideExecutor(Executor serverSideExecutor) {
this.serverSideExecutor = serverSideExecutor;
}
public ScheduledExecutorService getIpSyncExecutor() {
return ipSyncExecutor;
}
public void setIpSyncExecutor(ScheduledExecutorService ipSyncExecutor) {
this.ipSyncExecutor = ipSyncExecutor;
}
public int getReadThreadPoolSize() {
return readThreadPoolSize;
}
public void setReadThreadPoolSize(int readThreadPoolSize) {
this.readThreadPoolSize = readThreadPoolSize;
}
public int getClientSideThreadPoolSize() {
return clientSideThreadPoolSize;
}
public void setClientSideThreadPoolSize(int clientSideThreadPoolSize) {
this.clientSideThreadPoolSize = clientSideThreadPoolSize;
}
public int getServerSideThreadPoolSize() {
return serverSideThreadPoolSize;
}
public void setServerSideThreadPoolSize(int serverSideThreadPoolSize) {
this.serverSideThreadPoolSize = serverSideThreadPoolSize;
}
public int getMaxQueueSize() {
return maxQueueSize;
}
public void setMaxQueueSize(int maxQueueSize) {
this.maxQueueSize = maxQueueSize;
}
public int getMaxConnTimeOutCount() {
return maxConnTimeOutCount;
}
public void setMaxConnTimeOutCount(int maxConnTimeOutCount) {
this.maxConnTimeOutCount = maxConnTimeOutCount;
}
public void setServerCharset(String serverCharset) {
this.serverCharset = serverCharset;
}
public int getMaxResult() {
return maxResult;
}
public void setMaxResult(int maxResult) {
this.maxResult = maxResult;
}
public boolean isAutocommit() {
return autocommit;
}
public void setAutocommit(boolean autocommit) {
this.autocommit = autocommit;
}
static class ReNameableThreadExecutor extends ThreadPoolExecutor {
public ReNameableThreadExecutor(int poolSize) {
super(poolSize, poolSize, Long.MAX_VALUE, TimeUnit.NANOSECONDS,
new LinkedBlockingQueue<Runnable>());
}
}
public int getIsolationLevel() {
return isolationLevel;
}
public void setIsolationLevel(int isolationLevel) {
this.isolationLevel = isolationLevel;
}
@Override
public void init() throws InitialisationException {
readExecutor = new ReNameableThreadExecutor(getReadThreadPoolSize());
serverSideExecutor = new ReNameableThreadExecutor(getServerSideThreadPoolSize());
clientSideExecutor = new ReNameableThreadExecutor(getClientSideThreadPoolSize());
ipSyncExecutor = Executors.newSingleThreadScheduledExecutor();
}
}