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.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 HttpGetPool { private static Logger logger = LogManager.getLogger(HttpGetPool.class.getName()); private final LinkedList<HttpGet> pool; private HttpGetConfigHandler handler; private final static RequestConfigPool<HttpGet> requestConfigPool = new RequestConfigPool(); public HttpGetPool() { pool = new LinkedList<>(); } public synchronized HttpGet poll(Url url) { if(url.getRequestState()!=Url.REQUEST_STATE_GET){ throw new RuntimeException("url 不为get请求,不能获取httpGet"); } logger.info("获取HttpGet url:{}", url); HttpGet httpGet = null; if (pool.size() == 0) { httpGet = new HttpGet(url.getUrl()); } else { httpGet = pool.poll(); httpGet.setURI(URI.create(url.getUrl())); } if (handler != null) httpGet = handler.setConfig(httpGet, url); if(url.getRequestConfigClass()!=null){ httpGet = requestConfigPool.getRequestConfig(url.getRequestConfigClass()).setConfig(httpGet,url); } return httpGet; } public synchronized void offer(HttpGet httpGet) { logger.debug("回收HttpGet{},当前HttpGetPool里HttpGet的数量为:{}", httpGet.toString(), pool.size()); httpGet.setURI(null); httpGet.setConfig(null); clearHeader(httpGet); pool.offer(httpGet); } private void clearHeader(HttpGet httpGet){ for (final HeaderIterator i = httpGet.headerIterator(); i.hasNext(); ) { i.nextHeader(); i.remove(); } } public synchronized HttpGetPool setConfigHandler(HttpGetConfigHandler handler) { this.handler = handler; return this; } public interface HttpGetConfigHandler { HttpGet setConfig(HttpGet httpGet, Url url); } }