package com.jackson.common.task;
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.db.service.UrlService;
import com.jackson.task.RequestParserTask;
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/1/11.
* 当请求失败,将url重放入,下次换了proxy 再请求
* 当请求成功,解析不成功时,不会处理
* 当请求成功,解析成功时,会将url设置成完成状态
*/
public class SimpleRequestTask extends RequestParserTask{
private static Logger logger = LogManager.getLogger(SimpleRequestTask.class.getName());
private final UrlService urlService;
private final Url url;
private final ProxyController proxyController;
private Proxy proxy;
private final CommonSource source;
//proxyController 传入的作用是回收proxy
public SimpleRequestTask(Proxy proxy,ProxyController proxyController, Url url, UrlService urlService,CommonSource source){
this.url = url;
this.proxy = proxy;
this.proxyController = proxyController;
this.source = source;
this.urlService = urlService;
}
public SimpleRequestTask(Url url, UrlService urlService,CommonSource source){
this(null,null,url,urlService,source);
}
public SimpleRequestTask(Url url,CommonSource source){
this(null,null,url,null,source);
}
@Override
public HttpRequestBase getHttpRequest() {
if(getUrl().getRequestState()==Url.REQUEST_STATE_GET){
return source.pollHttpGet(getUrl());
}
if(getUrl().getRequestState() == Url.REQUEST_STATE_POST){
return source.pollHttpPost(getUrl());
}
throw new RuntimeException("SimpleRequestTask 请求对象获取错误");
}
@Override
public void onRequestException(Exception e, Url url, HttpRequestBase httpRequest) {
if(getProxy()!=null){
logger.error("请求失败 url:{} proxy:{}:{} Exception:{}", url.getUrl(),getProxy().getHost(),getProxy().getPort(),e.toString());
}else {
logger.error("请求失败 url:{} Exception:{}", url.getUrl(),e.toString());
}
}
@Override
public void onRequestFinish(boolean isRequestOk, CloseableHttpClient httpClient, HttpRequestBase httpRequest, Url url) {
if (!isRequestOk) {
if(getUrlService()!=null)
getUrlService().add(getUrl());//如果失败,就重新放入数据库,等着下次接着用,如果成功等着解析,解析成功后回收
}
if(url.getRequestState() == Url.REQUEST_STATE_GET){
source.offerHttpGet((HttpGet) httpRequest);
}
if(url.getRequestState() == Url.REQUEST_STATE_POST){
source.offerHttpPost((HttpPost) httpRequest);
}
}
@Override
protected Url getUrl() {
return url;
}
@Override
protected Proxy getProxy() {
return proxy;
}
@Override
protected ProxyController getProxyController() {
return proxyController;
}
@Override
protected UrlService getUrlService() {
return urlService;
}
@Override
protected boolean onStatusCode(int statusCode, CloseableHttpResponse response) {
if(!(statusCode >= 200 && statusCode<300)){
if(getProxy()!=null){
logger.error("请求失败 statusCode:{} url:{} proxy:{}", statusCode,getUrl().getUrl(),proxy);
}else {
logger.error("请求失败 statusCode:{} url:{}", statusCode,getUrl().getUrl());
}
}
return statusCode >= 200 &&statusCode<300;
}
@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);//记录错误日志,方便排查问题,改解析代码
}
@Override
protected void onParseFinish(boolean parseSuccess, Url url, String content) {
if (parseSuccess){
if(getUrlService()!=null)
getUrlService().completeUrl(getUrl());//设置成完成状态
if(proxy!=null && proxyController!=null){
proxyController.getProxyPool().offer(proxy);
}
}
}
}