package com.jackson.task; import com.jackson.db.po.Proxy; import com.jackson.db.po.Url; import com.jackson.net.HttpClientCreater; import org.apache.http.HttpHost; import org.apache.http.StatusLine; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.conn.ConnectTimeoutException; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; import java.net.SocketTimeoutException; /** * Created by Jackson on 2016/11/17. * 只做请求的task */ public abstract class RequestTask implements ITask{ private static Logger logger = LogManager.getLogger(RequestTask.class.getName()); protected abstract Url getUrl(); private long startTime; private long endTime; protected abstract Proxy getProxy(); /** * @param statusCode 状态码 * @param response @return true:状态正确 false:状态错误,返回false 则代表请求失败,onRequestFinisn()里第一个参数为false * <p> * 并且不会回调 * getParser()、onParseSuccess(Url url, String content)、onParseException(Exception e, Url url, String content) */ protected abstract boolean onStatusCode(int statusCode, CloseableHttpResponse response); protected abstract void onInit(); @Override public CloseableHttpClient getHttpClient() { if(getUrl().getProtocolState()==Url.PROTOCOL_STATE_HTTP){ return HttpClientCreater.instance.getHttpClient(); } if(getUrl().getProtocolState()==Url.PROTOCOL_STATE_HTTPS){ return HttpClientCreater.instance.getHttpsClient(); } throw new RuntimeException("RequestParserTask 协议类型错误"); } @Override public String doRequest(CloseableHttpClient client, HttpRequestBase requestBase) throws IOException { logger.info("请求 url:{}",getUrl().getUrl()); startTime = System.currentTimeMillis(); if(getProxy()!=null){ response = client.execute(new HttpHost(getProxy().getHost(),getProxy().getPort()),requestBase); }else { response = client.execute(requestBase); } response = client.execute(requestBase); endTime = System.currentTimeMillis(); logger.info("endTime:",endTime); //HttpEntity entity = response.getEntity(); return "";//EntityUtils.toString(entity, "utf-8"); } CloseableHttpResponse response = null; @Override public void run() { boolean isRequestOk = true; onInit(); final HttpRequestBase httpRequest = getHttpRequest(); final CloseableHttpClient httpClient = getHttpClient(); try{ doRequest(httpClient, httpRequest); StatusLine statusLine = response.getStatusLine(); int statusCode = statusLine.getStatusCode(); isRequestOk = onStatusCode(statusCode, response); } catch (SocketTimeoutException e) { isRequestOk = false; onRequestException(e,getUrl(), httpRequest); } catch (ClientProtocolException e) { isRequestOk = false; onRequestException(e,getUrl(), httpRequest); } catch (ConnectTimeoutException e) { isRequestOk = false; onRequestException(e,getUrl(), httpRequest); } catch (IOException e) { isRequestOk = false; onRequestException(e,getUrl(), httpRequest); } finally { try { if (response != null) response.close(); } catch (IOException e) { e.printStackTrace(); } onRequestFinish(isRequestOk,httpClient,httpRequest,getUrl()); } } protected long getSpeed(){ logger.info("ip:{}:{} 速度为 {}",getProxy().getHost(),getProxy().getPort(),endTime-startTime); return endTime-startTime; } }