`

httpclient 多线程执行(网上版本太多了。。。误人子弟)

阅读更多

The Commons HttpClient project is now end of life, and is no longer being developed. It has been replaced by the Apache HttpComponents project in its HttpClient and HttpCore modules, which offer better performance and more flexibility.

 

commons httpClient在2011年的3.11就结束了;被拆分成了 HttpClient and HttpCore 2个模块;
因此MultiThreadedHttpConnectionManager早就废弃了;网上众多真是误人子弟
最新API为4.5;

 

 

2.4. Multithreaded request execution  多线程请求执行;
When equipped with a pooling connection manager such as PoolingClientConnectionManager, HttpClient can be used to execute multiple requests simultaneously using multiple threads of execution.
当配有池连接的管理器如poolingclientconnectionmanager,HttpClient可以用多线程来执行多个请求同时使用。
The PoolingClientConnectionManager will allocate connections based on its configuration. If all connections for a given route have already been leased, a request for a connection will block until a connection is released back to the pool. One can ensure the connection manager does not block indefinitely in the connection request operation by setting 'http.conn-manager.timeout' to a positive value. If the connection request cannot be serviced within the given time period ConnectionPoolTimeoutException will be thrown.
的poolingclientconnectionmanager将分配基于其配置连接。如果一个给定路由的所有连接已经被租用时,新一个连接的请求将被阻止,直到一个连接被释放回池。
如果想让连接管理器不会无限期阻塞的新进来的连接请求,那么给http.conn-manager.timeout' 设置一个值,
如果连接请求不能被服务在给定的时间范围内,connectionpooltimeoutexception异常将被抛出。

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 .

虽然HttpClient实例是线程安全的和可执行的多个线程之间共享,但是HttpContext实例则不是这样,强烈建议每个线程维护自己专用的HttpContext实例。

 

 

 

 

 

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();
}

 

 

 

 

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
        }
    }

}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics