java httpclient 4.x 解决问题的性能指南

标签 java performance apache-httpclient-4.x

文章不错http://hc.apache.org/httpclient-3.x/performance.html与 http 性能、池化等相关。 找不到最新的 4.x 版本的相同内容。有人看到了吗?我在重负载下遇到了性能问题,并希望解决这些问题。 我正在使用 4.1 版本。 这是探查器输出:

26% org.apache.http.impl.client.CloseableHttpClient.execute(multiple parameter matches) :26,107,40
26% org.apache.http.impl.client.CloseableHttpClient.execute(org.apache.http.client.methods.HttpUriRequest, org.apache.http.protocol.HttpContext) :82,46
26% org.apache.http.impl.client.AbstractHttpClient.doExecute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) :882,818
26% org.apache.http.impl.client.AbstractHttpClient.createHttpContext() :301
26% org.apache.http.impl.client.AbstractHttpClient.getConnectionManager() :484
26% org.apache.http.impl.client.AbstractHttpClient.createClientConnectionManager() :321
26% org.apache.http.impl.conn.SchemeRegistryFactory.createDefault() :52
26% org.apache.http.conn.ssl.SSLSocketFactory.getSocketFactory() :168
26% org.apache.http.conn.ssl.SSLContexts.createDefault() :58
26% javax.net.ssl.SSLContext.init(javax.net.ssl.KeyManager[], javax.net.ssl.TrustManager[], java.security.SecureRandom) :283
26% sun.security.ssl.SSLContextImpl.engineInit(javax.net.ssl.KeyManager[], javax.net.ssl.TrustManager[], java.security.SecureRandom) :83,92
26% javax.net.ssl.TrustManagerFactory.init(java.security.KeyStore) :250
26% sun.security.ssl.TrustManagerFactoryImpl.engineInit(java.security.KeyStore) :51
26% sun.security.ssl.TrustManagerFactoryImpl.getCacertsKeyStore(java.lang.String) :221
26% java.security.KeyStore.load(java.io.InputStream, char[]) :1214
26% sun.security.provider.JavaKeyStore$JKS.engineLoad(java.io.InputStream, char[]) :55
26% sun.security.provider.JavaKeyStore.engineLoad(java.io.InputStream, char[]) :723,747
26% java.security.cert.CertificateFactory.generateCertificate(java.io.InputStream) :339
26% sun.security.provider.X509Factory.engineGenerateCertificate(java.io.InputStream) :93
26% sun.security.provider.X509Factory.getFromCache(sun.security.util.Cache, byte[]) :203

我有 4 种方法使用 httpclient 通过 HTTP 发送一些数据,这些方法中的每一种都消耗了总时间的 25%。其余处理需要毫秒。看来我以错误的方式使用了 httpclient。

编辑: 查看 oleg 答案 + 阅读 https://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html 回答所有相关问题

主要部分是: 构建池管理器的好方法

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
// Increase max total connection to 200
cm.setMaxTotal(200);
// Increase default max connection per route to 20
cm.setDefaultMaxPerRoute(20);
// Increase max connections for localhost:80 to 50
HttpHost localhost = new HttpHost("locahost", 80);
cm.setMaxPerRoute(new HttpRoute(localhost), 50);

CloseableHttpClient httpClient = HttpClients.custom()
        .setConnectionManager(cm)
        .build();

并发使用HttpClient的方法

//While HttpClient instances are thread safe and can be shared
//between multiple threads of execution, it is highly recommended that 
//each thread maintains its own dedicated instance of HttpContext .


static class GetThread extends Thread {

    private final CloseableHttpClient httpClient;
    private final HttpContext context;
    private final HttpGet httpget;

    public GetThread(CloseableHttpClient httpClient, HttpGet httpget) {
        this.httpClient = httpClient;
        this.context = HttpClientContext.create();
        this.httpget = httpget;
    }

    @Override
    public void run() {
        try {
            CloseableHttpResponse response = httpClient.execute(
                    httpget, context);
            try {
                HttpEntity entity = response.getEntity();
            } finally {
                response.close();
            }
        } catch (ClientProtocolException ex) {
            // Handle protocol errors
        } catch (IOException ex) {
            // Handle I/O errors
        }
    }

}

最佳答案

主要推荐还是和3.1一样

请务必重新使用 HttpClient 实例! HttpClient 实例非常昂贵。通过丢弃它,您不仅丢弃了实例本身,还丢弃了 SSL 上下文、连接管理器以及连接管理器可能保持 Activity 状态的所有持久连接。

关于java httpclient 4.x 解决问题的性能指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30528912/

相关文章:

java - solr 与 mysql 驱动程序的索引性能

java - Apache Http 客户端超时问题

java - Apache HTTPClient 4.3.3 执行 GET 请求 block 的方法并且从不返回

java - 为 ssl 身份验证编写 java 客户端

java - 从 spring Controller 类中的 jsp 检索多个复选框值

java.lang.Exception : java. io.IOException:设置 hadoop 和 hbase 时值类错误

java - LWJGL的窗口创建后如何移动?

c++ - 为什么当远远超过 CPU 缓存大小时内存访问时间会增加

在链接时定义的 C 常量

performance - 如何在 AppleScript 的处理程序中有效地构建列表?