package com.jackson.common.control; import com.jackson.common.source.CommonSource; import com.jackson.common.task.SimpleRequestTask; import com.jackson.db.po.Url; import com.jackson.db.service.IDaoService; import com.jackson.db.service.UrlService; import com.jackson.reservoir.HttpGetPool; import com.jackson.reservoir.HttpPostPool; import com.jackson.reservoir.ProxyPool; import com.jackson.task.CreateTaskThread; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.concurrent.ScheduledThreadPoolExecutor; /** * Created by Jackson on 2016/12/21. */ public class SimpleRequestControl { private final ProxyController proxyController; private ProxyPool proxyPool; private DelayHandle delayHandle; public static SimpleRequestControl newInstance(UrlService urlService){ return new SimpleRequestControl(urlService,null); } public static SimpleRequestControl newInstance(UrlService urlService,ProxyController proxyController){ return new SimpleRequestControl(urlService,proxyController); } private static Logger logger = LogManager.getLogger(SimpleRequestControl.class.getName()); private final CreateTaskThread createTaskThread; private final CommonSource source; private final UrlService urlService; private ControlConfig controlConfig; private SimpleRequestControl(UrlService urlService,ProxyController proxyController) { this.urlService = urlService; this.proxyController = proxyController; source = CommonSource.newInstance(); createTaskThread = new TaskThread(urlService,source.getThreadPool()); } public void start(){ initConfig(); if(proxyController !=null){ proxyPool = proxyController.getProxyPool(); proxyController.start(); } createTaskThread.start(); } public SimpleRequestControl setDelay(DelayHandle delayHandle){ this.delayHandle = delayHandle; return this; } private void initConfig() { if(controlConfig ==null){ controlConfig = getDefaultConfig(); } source.getThreadPool().setCorePoolSize(controlConfig.getCorePoolSize()); createTaskThread.setMaxTaskCache(controlConfig.getMaxTaskCache()) .setMinTaskCache(controlConfig.getMinTaskCache()); urlService.setGetUrlSize(controlConfig.getGetServiceCatchSize()); urlService.setMinUrlCatch(controlConfig.getMinServiceCatch()); } private class TaskThread extends CreateTaskThread<Url>{ public TaskThread(IDaoService<Url> service, ScheduledThreadPoolExecutor threadPool) { super(service, threadPool); } @Override protected Runnable getTask(Url url) { if(proxyController!=null){ return new SimpleRequestTask(proxyPool.take(),proxyController,url,urlService,source); }else { return new SimpleRequestTask(url,urlService,source); } } @Override protected long getDelay(Url url) { if(delayHandle!=null){ return delayHandle.getDelay(url); }else { return 0; } } } public void setControlConfig(ControlConfig controlConfig){ this.controlConfig = controlConfig; } /** * 设置线程数,其他变量根据线程数自动配置,在start()方法前调用 * @param threadSize */ public SimpleRequestControl setThreadSize(int threadSize){ ControlConfig controlConfig = ControlConfig.builder() .setCorePoolSize(threadSize) .setMaxTaskCache(3*threadSize) .setMinTaskCache(threadSize+1) .setGetServiceCatchSize(6*threadSize) .setMinServiceCatch(2*threadSize+1) .build(); setControlConfig(controlConfig); return this; } public ControlConfig getDefaultConfig(){ return ControlConfig.builder() .setCorePoolSize(10) .setMaxTaskCache(30) .setMinTaskCache(11) .setGetServiceCatchSize(60) .setMinServiceCatch(21) .build(); } public void setHttpGetConfigHandler(HttpGetPool.HttpGetConfigHandler handler){ source.getHttpGetPool().setConfigHandler(handler); } public void setHttpPostConfigHandler(HttpPostPool.HttpPostConfigHandler handler){ source.getHttpPostPool().setConfigHandler(handler); } public interface DelayHandle{ long getDelay(Url url); } }