package com.jackson.reservoir;
import com.jackson.db.po.Url;
import com.jackson.utils.StringUtil;
import org.apache.http.HeaderIterator;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.net.URI;
import java.util.LinkedList;
/**
* Created by Jackson on 2016/10/27.
*/
public class HttpPostPool {
private static Logger logger = LogManager.getLogger(HttpPostPool.class.getName());
private final LinkedList<HttpPost> pool;
private HttpPostConfigHandler handler;
private final static RequestConfigPool<HttpPost> requestConfigPool = new RequestConfigPool();
public HttpPostPool() {
pool = new LinkedList<>();
}
public synchronized HttpPost poll(Url url) {
if(url.getRequestState()!=Url.REQUEST_STATE_POST){
throw new RuntimeException("url 不为post请求,不能获取httpPost");
}
logger.info("获取HttpPost url:{}", url.getUrl());
HttpPost httpPost = null;
if (pool.size() == 0) {
httpPost = new HttpPost(url.getUrl());
} else {
httpPost = pool.poll();
httpPost.setURI(URI.create(url.getUrl()));
}
if(handler!=null)
handler.setConfig(httpPost,url);
if(url.getRequestConfigClass()!=null){
httpPost = requestConfigPool.getRequestConfig(url.getRequestConfigClass()).setConfig(httpPost,url);
}
return httpPost;
}
public synchronized void offer(HttpPost httpPost) {
httpPost.setURI(null);//插入时清空数据
httpPost.setEntity(null);
httpPost.setConfig(null);
clearHeader(httpPost);
pool.offer(httpPost);
logger.debug("回收HttpPost{},当前HttpPostPool里HttpPost的数量为:{}", httpPost.toString(), pool.size());
}
private void clearHeader(HttpPost httpPost){
for (final HeaderIterator i = httpPost.headerIterator(); i.hasNext(); ) {
i.nextHeader();
i.remove();
}
}
public interface HttpPostConfigHandler {
/**
* 如果同时有设置了handler 和 Url里的postConfigClassName ,会先执行 handler的设置再执行 postConfigClassName里的设置
* @param httpPost
* @param url
* @return
*/
HttpPost setConfig(HttpPost httpPost, Url url);
}
public synchronized HttpPostPool setConfigHandler(HttpPostConfigHandler handler) {
this.handler = handler;
return this;
}
}