`
k1280000
  • 浏览: 202634 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

httpclient 3.X 4.X 性能优化

    博客分类:
  • http
 
阅读更多

3.X

http://hc.apache.org/httpclient-3.x/performance.html

 

public class MultiThreadedExample {

    /**
     * Constructor for MultiThreadedExample.
     */
    public MultiThreadedExample() {
        super();
    }

    public static void main(String[] args) {
        
        // Create an HttpClient with the MultiThreadedHttpConnectionManager.
        // This connection manager must be used if more than one thread will
        // be using the HttpClient.
        HttpClient httpClient = new HttpClient(new MultiThreadedHttpConnectionManager());
        // Set the default host/protocol for the methods to connect to.
        // This value will only be used if the methods are not given an absolute URI
        httpClient.getHostConfiguration().setHost("hc.apache.org", 80, "http");
        
        // create an array of URIs to perform GETs on
        String[] urisToGet = {
            "/",
            "/httpclient-3.x/status.html",
            "/httpclient-3.x/methods/",
            "http://svn.apache.org/viewvc/httpcomponents/oac.hc3x/"
        };
        
        // create a thread for each URI
        GetThread[] threads = new GetThread[urisToGet.length];
        for (int i = 0; i < threads.length; i++) {
            GetMethod get = new GetMethod(urisToGet[i]);
            get.setFollowRedirects(true);
            threads[i] = new GetThread(httpClient, get, i + 1);
        }
        
        // start the threads
        for (int j = 0; j < threads.length; j++) {
            threads[j].start();
        }
        
    }
    
    /**
     * A thread that performs a GET.
	 */
    static class GetThread extends Thread {
        
        private HttpClient httpClient;
        private GetMethod method;
        private int id;
        
        public GetThread(HttpClient httpClient, GetMethod method, int id) {
            this.httpClient = httpClient;
            this.method = method;
            this.id = id;
        }
        
        /**
         * Executes the GetMethod and prints some satus information.
         */
        public void run() {
            
            try {
                
                System.out.println(id + " - about to get something from " + method.getURI());
                // execute the method
                httpClient.executeMethod(method);
                
                System.out.println(id + " - get executed");
                // get the response body as an array of bytes
                byte[] bytes = method.getResponseBody();
                
                System.out.println(id + " - " + bytes.length + " bytes read");
                
            } catch (Exception e) {
                System.out.println(id + " - error: " + e);
            } finally {
                // always release the connection after we're done 
                method.releaseConnection();
                System.out.println(id + " - connection released");
            }
        }
       
    }
    
}

 

 

 

4.X

http://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html/connmgmt.html

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

// URIs to perform GETs on
String[] urisToGet = {
    "http://www.domain1.com/",
    "http://www.domain2.com/",
    "http://www.domain3.com/",
    "http://www.domain4.com/"
};

// create a thread for each URI
GetThread[] threads = new GetThread[urisToGet.length];
for (int i = 0; i < threads.length; i++) {
    HttpGet httpget = new HttpGet(urisToGet[i]);
    threads[i] = new GetThread(httpClient, httpget);
}

// start the threads
for (int j = 0; j < threads.length; j++) {
    threads[j].start();
}

// join the threads
for (int j = 0; j < threads.length; j++) {
    threads[j].join();
}

 

 

 

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.*;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * Created by
 * on 16/10/11.
 * Description:  测试pool会自动管理connection
 */
public class Test {
    // 长连接保持30秒
    static PoolingHttpClientConnectionManager pollingConnectionManager = new PoolingHttpClientConnectionManager(30, TimeUnit.SECONDS);

    public static CloseableHttpClient buildHttpClient() {
        // 总连接数
        pollingConnectionManager.setMaxTotal(2);
        // 同路由的并发数
        pollingConnectionManager.setDefaultMaxPerRoute(500);

        HttpClientBuilder httpClientBuilder = HttpClients.custom();
        httpClientBuilder.setConnectionManager(pollingConnectionManager);
        // 重试次数,默认是3次,没有开启
        httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(2, true));
        // 保持长连接配置,需要在头添加Keep-Alive
        httpClientBuilder.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE);

        List<Header> headers = new ArrayList<>();
        headers.add(new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36"));
        headers.add(new BasicHeader("Accept-Encoding", "gzip,deflate"));
        headers.add(new BasicHeader("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6"));
        headers.add(new BasicHeader("Connection", "keep-alive"));

        httpClientBuilder.setDefaultHeaders(headers);

        return httpClientBuilder.build();
    }

    public static void main(String args[]) throws IOException, InterruptedException {
        CloseableHttpClient closeableHttpClient = buildHttpClient();
        HttpPost post = new HttpPost("");
        StringEntity se = new StringEntity("");
        se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
        post.setEntity(se);
        CountDownLatch countDownLatch = new CountDownLatch(10);
        for (int i = 10; i > 0; i--) {
            new Thread(() -> {
                try {
                    String result = closeableHttpClient.execute(post, new ResponseHandler<String>() {
                        @Override
                        public String handleResponse(HttpResponse response) throws IOException {
                            int status = response.getStatusLine().getStatusCode();
                            HttpEntity entity = response.getEntity();
                            if (status >= 200 && status < 300) {
                                return EntityUtils.toString(entity);
                            }
                            System.out.println(status);
                            return null;
                        }
                    });
                    System.out.println(result);
                    countDownLatch.countDown();
                } catch (IOException e) {
                    e.printStackTrace();
                    countDownLatch.countDown();
                }
            }).start();
        }
        countDownLatch.await();
        System.in.read();
    }
}

 

 

 

 

 

分享到:
评论

相关推荐

    HttpClient 3.x to HttpComponents HttpClient 4.x

    综上所述,升级到HttpComponents HttpClient 4.x是一个复杂的过程,涉及到对新API的深入学习,理解新的编程模型和网络编程的优化。升级的好处包括性能的提升、更好的错误处理机制以及对最新HTTP协议特性的支持。通过...

    HTTPClient 4.3.X

    在4.3.X版本中,它可能包含了性能优化,新特性和bug修复。 描述中提到的链接指向了一个ITEYE博客,虽然内容未给出,但可以推测博主可能分享了关于使用HTTPClient 4.3.X的一些经验,可能包括配置,最佳实践,或者是...

    httpclient4.x官方范例

    在4.x版本中,HTTPClient进行了重大更新,与之前的3.x版本相比,它引入了更多的功能、优化和改进。本文将深入探讨HTTPClient 4.x的核心特性,并基于提供的"httpclient4.1_examples"示例文件,解析如何使用这个库进行...

    httpclient4.3.x及其依赖jar包

    7. **性能优化**:通过缓存机制,HttpClient可以缓存响应,减少不必要的网络通信。 8. **国际化与本地化**:HttpClient支持多种字符集和编码,适应不同地区的Web服务。 **HttpClient 4.3.x的依赖分析** ...

    httpclient-4.5.2.jar.zip

    6. 性能优化: - **连接池配置**:根据应用需求调整连接池的最大连接数和超时时间,以平衡资源使用和响应速度。 - **线程池管理**:使用线程池并发处理多个请求,避免创建过多线程消耗资源。 - **异步执行**:...

    httpclient4.4.1 and httpclient4.5.3.rar

    HttpClient 4.4.1是HttpClient系列的一个稳定版本,它主要关注性能优化和错误修复。以下是一些关键特性: - **连接管理**:HttpClient 4.4.1引入了更智能的连接管理和重用策略,提高了并发性能。它支持多路复用,...

    httpClient

    4. **性能优化**:HttpClient 4.x相比3.x在性能上有显著提升,尤其是在连接管理和并发请求处理上。 5. **新特性支持**:HttpClient 4.x增加了对HTTP/1.1、HTTP/2等协议的支持,而HttpClient 3.x主要针对HTTP/1.0。 ...

    commons-httpclient-3.0.jar JAVA中使用HttpClient可以用到

    虽然`commons-httpclient-3.0.jar`是一个经典版本,但随着Java的发展,Apache社区已经推出了更现代的HttpClient 4.x系列,提供了更多改进和优化,如更好的线程安全、更丰富的API以及对HTTP/2的支持。因此,建议在新...

    httpclient.jar4.4及4.5版本和httpcore.jar和commons-logging.jar.rar

    HTTPClient 4.4和4.5之间的主要差异可能在于错误修复、性能优化和新功能的添加。 HTTPCore是HTTPClient的核心组件,它提供了基本的HTTP协议处理功能,如TCP连接管理、HTTP消息解析和编码等。这个库的设计目的是为了...

    HttpClient3.1.jar

    HttpClient3.1.jar是Apache软件基金会的一个...然而,需要注意的是,HttpClient3.1已较为陈旧,后续的版本如HttpClient 4.x引入了更多的改进和优化,因此在新的项目中,建议使用更新的版本以获得更好的性能和兼容性。

    httpClient组合包.zip

    HttpCore的更新主要关注性能优化和错误修复,确保HttpClient的稳定性和效率。 3. **httpmime-4.5.13.jar**:这个库专门用于处理HTTP请求中的MIME类型数据,特别是当需要发送复杂或二进制数据时,如文件上传。它提供...

    初学java,未有小成 --- httpClient4.jar包学习

    HttpClient 4.x引入了PoolingHttpClientConnectionManager,它可以复用已建立的TCP连接,提高性能。你需要配置合适的最大连接数、每个路由的最大连接数,以及连接的超时时间。 此外,HttpClient支持多种认证机制,...

    httpclient.zip

    7. **性能优化**: - 面向流的API:使用`HttpEntity`和`InputStream`/`OutputStream`处理大文件上传下载,避免内存溢出。 - 异步处理:通过`Future`或回调函数实现非阻塞的异步请求。 8. **pom文件**: - pom...

    最新org.apache.commons.httpclient.rar

    从3.x版本到后来的4.x版本,HttpClient进行了大量改进,包括API简化、更好的线程安全性和性能优化。然而,对于某些场景,3.x版本可能更符合某些开发者的习惯或者兼容性要求。 5. **替代品与升级**:随着Java生态的...

    httpclient4.2.2.zip

    HttpClient 4.2.2是HttpClient系列的一个重要版本,它在4.2.x系列中具有稳定性和性能的双重保障。 一、HttpClient 4.2.2的基础概念与特性 1. 基于Java的HTTP客户端接口:HttpClient 4.2.2提供了一套全面的API,使得...

    httpclient-4.5.jar

    3. `httpclient-cache-4.x.jar`:这个模块提供了HTTP缓存功能,可以根据HTTP缓存规范存储和检索已请求的资源,减少网络延迟。 4. `httpasyncclient-4.x.jar`:对于异步HTTP操作,这个库提供了非阻塞I/O支持,可以...

    httpclient4.1.2.zip

    通过深入理解和熟练运用HttpClient,开发者能够更好地控制和优化网络通信,提升应用的性能和稳定性。在实际项目中,结合具体的业务需求和场景,灵活运用HttpClient提供的功能,是提高开发效率和产品质量的关键。

    httpclient-4.1.2.jar

    不过,需要注意的是,随着技术的发展,HttpClient的后续版本可能会提供更多的特性或修复一些已知问题,因此在新项目中,可能需要考虑使用更现代的版本,如HttpClient 4.5.x或更高版本,以获取更好的性能和兼容性。

    commons-httpclient相关jar包

    然而,需要注意的是,虽然HttpClient 3.x系列是一个成熟且广泛使用的库,但它已不再维护,最新的版本是4.x系列。对于新的项目,推荐使用Apache HttpClient 4.x或更高版本,或者考虑使用Java 7及以后版本提供的内置`...

    httpclient-4.5.3.jar和httpclient-cache-4.5.3.jar 文件

    HttpClient 4.x系列是HttpClient的最新稳定版本,它带来了许多改进和新特性,旨在提高性能、稳定性和易用性。4.5.3版是在4.5系列中的一个小更新,修复了一些已知问题,提升了整体的可靠性和兼容性。 HttpClient库的...

Global site tag (gtag.js) - Google Analytics