package com.jackson.common.task; import com.jackson.bean.Bundle; import com.jackson.bean.ContextSrc; import com.jackson.common.control.ProxyController; import com.jackson.common.source.CommonSource; import com.jackson.db.po.Proxy; import com.jackson.db.po.Url; import com.jackson.task.queue.QueueTaskCollection; import com.jackson.task.queue.RequestQueueTask; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * Created by Jackson on 2017/2/10. * 串行请求任务。在该任务中url的parser无效果,解析工作通过 onResponseHandle()处理 * 不会自动回收proxy 和 url * * 还没写完 */ @Deprecated public abstract class SimpleQueueRequestTask extends RequestQueueTask { private static Logger logger = LogManager.getLogger(SimpleQueueRequestTask.class.getName()); private final Url url; public void setProxyController(ProxyController proxyController) { this.proxyController = proxyController; } private ProxyController proxyController; private final CommonSource source; private Proxy lastProxy; public SimpleQueueRequestTask(Url url, CommonSource source){ this.url = url; this.source = source; } @Override protected QueueTaskCollection.TaskProcess doTask(Bundle bundle) { if(url.getContextSrc()!=null){ Proxy proxy = url.getContextSrc().getProxy(); if(proxy!=null && lastProxy!=null){ if(proxy.equals(lastProxy)) url.getContextSrc().setProxy(proxyController.getProxyPool().take()); } }else { if(getProxy()!=null && lastProxy!=null){ if(getProxy().equals(lastProxy)){ getProxy().copyOf(proxyController.getProxyPool().take()); } } } QueueTaskCollection.TaskProcess taskProcess = super.doTask(bundle); lastProxy = getProxy(); return taskProcess; } @Override public HttpRequestBase getHttpRequest() { if(getUrl().getRequestState()==Url.REQUEST_STATE_GET){ return getHttpRequest(source.pollHttpGet(getUrl()),getBundle()); } if(getUrl().getRequestState() == Url.REQUEST_STATE_POST){ return getHttpRequest(source.pollHttpPost(getUrl()),getBundle()); } throw new RuntimeException("SimpleRequestTask 请求对象获取错误"); } protected abstract HttpRequestBase getHttpRequest(HttpRequestBase request,Bundle bundle); @Override public void onRequestException(Exception e, Url url, HttpRequestBase httpRequest) { logger.error("请求异常 url:{} Exception:{}", url.getUrl(),e.toString()); } @Override public void onRequestFinish(boolean isRequestOk, CloseableHttpClient httpClient, HttpRequestBase httpRequest, Url url) { if(url.getRequestState() == Url.REQUEST_STATE_GET){ source.offerHttpGet((HttpGet) httpRequest); } if(url.getRequestState() == Url.REQUEST_STATE_POST){ source.offerHttpPost((HttpPost) httpRequest); } } @Override public Url getUrl() { return url; } @Override protected boolean onStatusCode(int statusCode, CloseableHttpResponse response) { if(!(statusCode >= 200 && statusCode<300)){ if(getProxy()!=null){ logger.error("请求失败 statusCode:{} url:{} proxy:{}", statusCode,getUrl().getUrl(),getProxy()); }else { logger.error("请求失败 statusCode:{} url:{}", statusCode,getUrl().getUrl()); } } return statusCode >= 200 &&statusCode<300; } @Override public ProxyController getProxyController() { return proxyController; } @Override protected ContextSrc getContextSrc() { return getUrl().getContextSrc(); } @Override protected void onParseException(Exception e, Url url, String content) { logger.error("解析异常 url:{},parser:{},Exception{},content:{}", url.getUrl(),url.getParserClass(),e.toString(), content);//记录错误日志,方便排查问题,改解析代码 } }