我试图了解使用apache HTTPPooledConnectionManager和Closeable HTTPClient的最佳方法。 我看到的所有示例似乎都在请求中创建了一个新的HTTPClient,并且没有关闭HttpClient 它不应该是静态的还是每个类?如果可以重用带有池连接管理器的HttpClient并将连接释放回池中,那么我们每次发出请求时都不会创建HttpClient吗? 我想在基于弹簧的框架中特别理解这一点。
这是一个示例代码,我认为HttpClient应该是静态的。
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import java.io.IOException;
import java.net.URISyntaxException;
public class Stub2000 {
private CloseableHttpClient httpClient;
public void init() {
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(10000)
.setSocketTimeout(10000)
.setConnectionRequestTimeout(10000)
.build();
PoolingHttpClientConnectionManager poolManager = new PoolingHttpClientConnectionManager();
poolManager.setMaxTotal(10);
poolManager.setDefaultMaxPerRoute(10);
httpClient = HttpClients
.custom()
.setDefaultRequestConfig(config)
.setConnectionManager(poolManager)
.build();
}
public void getInfo() throws URISyntaxException, IOException {
final URIBuilder ruribuilder = new URIBuilder();
final HttpGet get = new HttpGet();
ruribuilder.setHost(host)
.setScheme("https")
.setPort(5555)
.setPath(uri)
.addParameter("txn",txn);
get.setURI(ruribuilder.build());
CloseableHttpResponse response = httpClient.execute(get);
try {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
String result = EntityUtils.toString(response.getEntity());
}
else {
//Some Error
}
}catch(Exception e){
e.printStackTrace();
} finally {
EntityUtils.consume(response.getEntity());
}
}
每次发出请求时,我们都会创建一个池大小为10的新HTTP客户端? 如果这是一个用spring框架初始化的bean,并且在bean初始化时调用了init方法,那么当spring初始化或者发出请求时,它只会执行一次吗?
答案 0 :(得分:1)
不应该是静态的还是每个班级?
如果可以重用带有池化连接管理器的HttpClient并将连接释放回池中,那么我们每次发出请求时都不会创建HttpClient吗?
每次发出请求时,我们都会创建一个池大小为10的新HTTP客户端?
如果这是一个用spring框架初始化的bean,并且在bean初始化时调用了init方法,那么当spring初始化或者每次发出请求时,它只会执行一次吗?
请参阅Spring RestTemplate - Need to release connection?,http://www.baeldung.com/spring-scheduled-tasks