package com.jackson.db.service;
import com.jackson.db.SqlUtil;
import com.jackson.db.dao.IpDao;
import com.jackson.db.po.Ip;
import com.jackson.executor.DBSingleExecutor;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
/**
* Created by Jackson on 2016/11/6.
*/
@Deprecated
public enum IpService implements IDaoService<Ip> {
instance;
private static Logger logger = LogManager.getLogger(IpService.class.getName());
private final SqlSessionFactory factory;
private LinkedBlockingQueue<Ip> queue;
private final HashSet insertIpsSet;
private final LinkedList insertIpsList;
private final HashSet updateIpsSet;
private final LinkedList updateIpsList;
private int getIpSize = 100;
private int minIpCatch = 20;
public IpService setGetIpSize(int getIpSize) {
this.getIpSize = getIpSize;
return this;
}
public IpService setMinIpCatch(int minIpCatch) {
this.minIpCatch = minIpCatch;
return this;
}
IpService() {
factory = SqlUtil.getFactory();
queue = new LinkedBlockingQueue<>();
insertIpsSet = new HashSet<Ip>();
insertIpsList = new LinkedList<Ip>();
updateIpsSet = new HashSet<>();
updateIpsList = new LinkedList<>();
init();
}
/**
* 添加到数据库
* @param ips
*/
public void insert(List<Ip> ips){
synchronized(insertIpsSet){
insertIpsSet.addAll(ips);
logger.info("添加新ip size:{} insertIpsSet size{}",ips.size(),insertIpsSet.size());
DBSingleExecutor.instance.execute(new InsertTask());
}
}
/**
* 添加到数据库
* @param ip
*/
public void insert(Ip ip){
synchronized(insertIpsSet){
insertIpsSet.add(ip);
logger.debug("添加新ipinsertIpsSet size{}",insertIpsSet.size());
DBSingleExecutor.instance.execute(new InsertTask());
}
}
private void init(){
setTask2Free();
createTable();
}
private void createTable() {
SqlSession sqlSession = null;
try {
sqlSession = factory.openSession();
IpDao mapper = sqlSession.getMapper(IpDao.class);
mapper.createTable();
sqlSession.commit();
} catch (Exception e){
logger.error(e.toString());
} finally{
sqlSession.close();
}
}
private void setTask2Free() {
SqlSession sqlSession = null;
try {
sqlSession = factory.openSession();
IpDao mapper = sqlSession.getMapper(IpDao.class);
mapper.setTakeState2Free();
sqlSession.commit();
} catch (Exception e){
logger.error(e.toString());
} finally{
sqlSession.close();
}
}
/**
* 存入数据库
* @param ips
*/
private void insertIpsToDatabase(List<Ip> ips) {
logger.info("ip存入数据库 insertIpsSet size:{}", ips.size());
SqlSession sqlSession = null;
try {
sqlSession = factory.openSession();
IpDao mapper = sqlSession.getMapper(IpDao.class);
mapper.insertsIgnore(ips);
sqlSession.commit();
} catch (Exception e) {
logger.error(e.toString());
} finally {
sqlSession.close();
}
}
/**
* 从数据库读取proxy 到测试队列中
*/
private synchronized void databaseToQueue() {
SqlSession sqlSession = null;
try {
sqlSession = factory.openSession();
IpDao mapper = sqlSession.getMapper(IpDao.class);
List<Ip> ips = mapper.findFreeMinTestTime(getIpSize);
logger.debug("数据库取出的 ips size:{}", ips.size());
if (ips.size() > 0) {
mapper.updateIpsToTakenOut(ips);
sqlSession.commit();
synchronized (queue){
queue.addAll(ips);
}
}
logger.info("当前缓存ips queue size:{}", queue.size());
} catch (Exception e) {
logger.error(e.toString());
} finally {
if (sqlSession != null)
sqlSession.close();
}
}
private void updateIpsToDatabase(List<Ip> ips) {
logger.info("更新ip size is {}", updateIpsSet.size());
SqlSession sqlSession = null;
try {
sqlSession = factory.openSession();
IpDao mapper = sqlSession.getMapper(IpDao.class);
for (Ip ipTemp : ips) {
mapper.update(ipTemp);
}
sqlSession.commit();
} catch (Exception e) {
logger.error(e.toString());
} finally {
sqlSession.close();
}
}
public void updateIp(Ip ip) {
logger.debug("更新Ip ip:{}:{}",ip.getHost(),ip.getPort());
synchronized (updateIpsSet){
updateIpsSet.add(ip);
}
DBSingleExecutor.instance.execute(new UpdateTask());
}
//task线程执行
private void updateIpsToDatabase(){
synchronized (updateIpsSet){
if(updateIpsSet.size()>0){
updateIpsList.addAll(updateIpsSet);
updateIpsToDatabase(updateIpsList);
updateIpsSet.clear();//存入数据库方法成功后才会清空
updateIpsList.clear();
}
}
}
//task线程执行
private void insertIpsToDatabase(){
synchronized (insertIpsSet){
if(insertIpsSet.size()>0){
insertIpsList.addAll(insertIpsSet);
insertIpsToDatabase(insertIpsList);
insertIpsSet.clear();//存入数据库方法成功后才会清空
insertIpsList.clear();
}
}
}
public Ip take() {
if (queue.size() < minIpCatch) {
synchronized (this){
if(queue.size()<minIpCatch){
DBSingleExecutor.instance.execute(new Database2Queue());
}
}
}
logger.info("queue size:{}", queue.size());
return queue.poll();
}
/**
* 添加到待测试queue中
* @param ips
*/
public void add(List<Ip> ips){
queue.addAll(ips);
}
private class UpdateTask extends DBSingleExecutor.DBTask{
@Override
public void run() {
updateIpsToDatabase();
}
}
private class InsertTask extends DBSingleExecutor.DBTask {
@Override
public void run() {
insertIpsToDatabase();
}
}
private class Database2Queue extends DBSingleExecutor.DBTask {
@Override
public void run() {
databaseToQueue();
}
}
}