2017-04-19 252 views
0

我想了解一些关于HttpAsyncClient的基本概念。如何处理HttpAsyncClient异常

  1. 我没有在这里使用连接池,在这里(1)或(2)关闭失败的http请求的正确方法是什么。

  2. 这里有什么性能影响,如果我用每个新请求初始化httpclient?

  3. 我是否需要在finally块中关闭所有失败请求的连接,不这样做的缺点是什么?

RequestConfig配置= RequestConfig.custom()setConnectTimeout(3 * 1000).setConnectionRequestTimeout(3 * 1000).setSocketTimeout(30 * 1000).build(); CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()。setDefaultRequestConfig(config).build();

httpclient.start();

尝试{

if (targetHost != null && httpget != null) 
    response = httpclient.execute(HttpHost, HttpGet); 
catch (Exception e) { 

    throw new CustomException("service.unavailable"); 

} finally { 
    if (httpget != null){ 
     httpget.releaseConnection(); (1) 
     httpclient.close();(2) 
    } 

} 

回答

1

一切看起来乍一看确定。我会摆脱httpget.releaseConnection(),这是没有必要的。运行close语句将处理您需要的所有内容,并释放运行连接的线程。这种回答你的第三个问题;关闭连接将释放连接到它的资源。

至于初始化一个新连接的每个请求;我不会如此关心资源,因为您连接的服务器/网站的响应与此相关。打开任何Web请求都需要时间,而不是代表您的服务器,而是等待响应和事情发生。我会写一个优化的函数,对所有的Web请求进行处理,并为每个请求调用它,因为它会打开一扇门,使它成为一个多线程应用程序,在其中可以建立多个连接而其他人正忙着建立多个连接。

+0

谢谢爱德华,如果我在finally块中根本没有关闭httpclient连接,那么会有新的请求创建一个新的线程而不关闭失败的连接?如果没有finally块,我的代码工作正常。 – Sindhu