使用Spring

时间:2018-06-08 07:19:52

标签: java spring apache http

我试图了解使用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初始化或者发出请求时,它只会执行一次吗?

1 个答案:

答案 0 :(得分:1)

不应该是静态的还是每个班级?

  • 为了获得更好的性能,最好重用客户端。你将如何重用 - 使其静态或创建一个将被注入的Bean - 取决于你。有时您可能需要具有不同配置的多个不同客户端,例如超时等。

如果可以重用带有池化连接管理器的HttpClient并将连接释放回池中,那么我们每次发出请求时都不会创建HttpClient吗?

  • 可以重复使用Connection Manager,这是可配置的。

每次发出请求时,我们都会创建一个池大小为10的新HTTP客户端?

  • 使用默认配置 - 是。

如果这是一个用spring框架初始化的bean,并且在bean初始化时调用了init方法,那么当spring初始化或者每次发出请求时,它只会执行一次吗?

  • 它不仅取决于要创建一次的bean,还取决于http客户端和连接管理器的配置

请参阅Spring RestTemplate - Need to release connection?http://www.baeldung.com/spring-scheduled-tasks