在多线程环境中使用 apache HttpClients 的最佳方式
Best way for apache HttpClients using in a multithreaded environment
我需要在服务器端创建一个服务来发送 HTTP 请求。它是这样工作的:
1. Client sends a request to the server
2. Server uses singleton service for calling 3rd-party API via HTTP.
3. API returns the response
4. Server process this response and return it to the client
这是一个同步过程。
我创建了服务:
public class ApacheHttpClient {
private final static CloseableHttpClient client = HttpClients.createDefault();
public String sendPost(String serverUrl, String body) {
try {
HttpPost httpPost = new HttpPost(serverUrl);
httpPost.setEntity(new StringEntity(body));
CloseableHttpResponse response = client.execute(httpPost);
String responseAsString = EntityUtils.toString(response.getEntity());
response.close();
return responseAsString;
} catch (IOException e) {
throw new RestException(e);
}
}
ApacheHttpClient
在我的系统中是一个单例。 CloseableHttpClient client
也是单例
问题 1:使用 CloseableHttpClient client
的一个实例是否正确,或者我应该为每个请求创建一个新实例?
问题二:什么时候关闭客户端?
问题3:这个客户端在一个时间段内只能处理2个连接。我应该使用遗嘱执行人吗?
将 HttpClient 实例用作每个不同 HTTP 服务的单例是正确的,并且符合 Apache HttpClient 最佳实践。不过,它应该 而不是 是静态的。
http://hc.apache.org/httpcomponents-client-5.1.x/migration-guide/preparation.html
释放HTTP服务时应关闭HttpClient。在您的情况下,ApacheHttpClient
应该实现 Closeable
并在其 #close
方法中关闭 CloseableHttpClient
的内部实例。
您可能不应该这样做,但这实际上取决于您的应用程序处理请求执行的准确程度。
我需要在服务器端创建一个服务来发送 HTTP 请求。它是这样工作的:
1. Client sends a request to the server
2. Server uses singleton service for calling 3rd-party API via HTTP.
3. API returns the response
4. Server process this response and return it to the client
这是一个同步过程。
我创建了服务:
public class ApacheHttpClient {
private final static CloseableHttpClient client = HttpClients.createDefault();
public String sendPost(String serverUrl, String body) {
try {
HttpPost httpPost = new HttpPost(serverUrl);
httpPost.setEntity(new StringEntity(body));
CloseableHttpResponse response = client.execute(httpPost);
String responseAsString = EntityUtils.toString(response.getEntity());
response.close();
return responseAsString;
} catch (IOException e) {
throw new RestException(e);
}
}
ApacheHttpClient
在我的系统中是一个单例。 CloseableHttpClient client
也是单例
问题 1:使用 CloseableHttpClient client
的一个实例是否正确,或者我应该为每个请求创建一个新实例?
问题二:什么时候关闭客户端?
问题3:这个客户端在一个时间段内只能处理2个连接。我应该使用遗嘱执行人吗?
将 HttpClient 实例用作每个不同 HTTP 服务的单例是正确的,并且符合 Apache HttpClient 最佳实践。不过,它应该 而不是 是静态的。
http://hc.apache.org/httpcomponents-client-5.1.x/migration-guide/preparation.html
释放HTTP服务时应关闭HttpClient。在您的情况下,
ApacheHttpClient
应该实现Closeable
并在其#close
方法中关闭CloseableHttpClient
的内部实例。您可能不应该这样做,但这实际上取决于您的应用程序处理请求执行的准确程度。