package jef.database.innerpool;
import java.util.concurrent.ConcurrentLinkedQueue;
import jef.common.log.LogUtil;
import jef.database.ORMConfig;
import jef.tools.ThreadUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 全局唯一的连接检查器
*
* @author jiyi
*
*/
final class PoolCheckThread extends Thread {
private static PoolCheckThread prt = new PoolCheckThread();
private Logger log = LoggerFactory.getLogger(this.getClass());
private boolean alive = true;
private final ConcurrentLinkedQueue<CheckablePool> pools = new ConcurrentLinkedQueue<CheckablePool>();
private PoolCheckThread() {
super();
setName("thread-JEFPoolChecker");
setDaemon(true);
}
/**
* 将连接池添加到心跳线程任务队列中
*
* @param pool
*/
public void addPool(CheckablePool pool) {
pools.add(pool);
if (ORMConfig.getInstance().isDebugMode()) {
LogUtil.show("The [" + pool.toString() + "] was added into PoolCheck task queue.");
}
if (alive && !isAlive()) {
try {
start();
} catch (IllegalStateException e) {
LogUtil.warn("Start check thread error.", e);
}
}
}
/**
* 将连接池从心跳线程任务队列中移除
*
* @param pool
* @return
*/
public boolean removePool(IPool<?> pool) {
return pools.remove(pool);
}
/**
* 获得连接池心跳任务实例
*
* @return 连接池心跳任务实例
*/
public static PoolCheckThread getInstance() {
if (prt == null || prt.getState() == State.TERMINATED) {
replaceInstance();
}
return prt;
}
private synchronized static void replaceInstance() {
if (prt == null || prt.getState() == State.TERMINATED) {
prt = new PoolCheckThread();
}
}
/**
* 关闭心跳任务
*/
public void close() {
this.alive = false;
}
@Override
public void run() {
ThreadUtils.doSleep(12000);
try {
while (alive) {
long sleep = ORMConfig.getInstance().getHeartBeatSleep();
if (sleep <= 0) {
sleep = 120000; // 不作心跳,一分钟后再行动
} else {
for (CheckablePool pool : pools) {
synchronized (pool) {
pool.doCheck();
}
}
}
ThreadUtils.doSleep(sleep);
}
log.info("Thread {} was terminated.", getName());
} catch (Exception e) {
log.error("", e);
}
}
}