package com.jackson.common.control;
import com.jackson.common.source.CommonSource;
import com.jackson.db.service.IDaoService;
import com.jackson.reservoir.HttpGetPool;
import com.jackson.reservoir.HttpPostPool;
import com.jackson.reservoir.ProxyPool;
import com.jackson.reservoir.TimedUrlPool;
import com.jackson.reservoir.TimedUrlPool.TimedUrl;
import com.jackson.task.CreateTaskThread;
import com.jackson.task.timer.TimedTask;
import java.util.concurrent.ScheduledThreadPoolExecutor;
/**
* Created by Jackson on 2016/12/27.
* 间隔重复请求管理类
*/
public class TimerRequestControl {
private final TimedUrlPool timedUrlPool;
private final ScheduledThreadPoolExecutor threadPool;
private final TaskThread taskThread;
private final CommonSource source;
private final ProxyController proxyController;
private ProxyPool proxyPool;
private int threadSize=2;
public static TimerRequestControl newInstance(){
return new TimerRequestControl(null);
}
public static TimerRequestControl newInstance(ProxyController proxyController){
return new TimerRequestControl(proxyController);
}
private TimerRequestControl(ProxyController proxyController){
this.proxyController = proxyController;
timedUrlPool = new TimedUrlPool();
source = CommonSource.newInstance();
threadPool = source.getThreadPool();
taskThread = new TaskThread(timedUrlPool, threadPool);
}
public void start(){
if(proxyController!=null){
proxyPool = proxyController.getProxyPool();
proxyController.start();
}
taskThread.setMinTaskCache(timedUrlPool.size()-1);
taskThread.setMaxTaskCache(timedUrlPool.size()+1);
taskThread.start();
}
public TimerRequestControl setThreadSize(int threadSize){
this.threadSize = threadSize;
return this;
}
public void addTimedUrl(TimedUrl timedUrl) {
timedUrlPool.offer(timedUrl);
}
private class TaskThread extends CreateTaskThread<TimedUrl> {
public TaskThread(IDaoService<TimedUrl> service, ScheduledThreadPoolExecutor threadPool) {
super(service, threadPool);
}
@Override
protected Runnable getTask(TimedUrl timedUrl) {
if(proxyController != null){
return new TimedTask(timedUrl, timedUrlPool,proxyController,proxyPool.take(),source);
}else {
return new TimedTask(timedUrl, timedUrlPool,source);
}
}
@Override
protected long getDelay(TimedUrl timedUrl) {
return timedUrl.getDelay();
}
}
public void setHttpGetConfigHandler(HttpGetPool.HttpGetConfigHandler handler){
source.getHttpGetPool().setConfigHandler(handler);
}
public void setHttpPostConfigHandler(HttpPostPool.HttpPostConfigHandler handler){
source.getHttpPostPool().setConfigHandler(handler);
}
}