我第一次使用Apache的HttpClient 4.5。我希望关闭池中未使用1分钟的连接,以免消耗资源。 我如何管理连接池是否正确? 我创建了两个单例:一个用于池管理器,一个用于客户端。我的池管理器启动一个线程并关闭未使用的连接。
这是我的泳池经理:
public class PoolConnectionsManager {
private static PoolConnectionsManager instance = null;
private PoolingHttpClientConnectionManager cm;
private PoolConnectionsManager() {
System.out.println("Instazio nuovo oggetto MyConnectionManager");
cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(20);
cm.setDefaultMaxPerRoute(20);
cm.closeIdleConnections(60, TimeUnit.SECONDS);
Runnable task = () -> {
System.out.println("EXECUTOR - Close connections in idle: 60 sec");
PoolConnectionsManager.getConnectionManager().closeIdleConnections(60, TimeUnit.SECONDS);
PoolConnectionsManager.getPoolStats();
};
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(task, 0, 60, TimeUnit.SECONDS);
}
public static PoolingHttpClientConnectionManager getConnectionManager() {
if (instance == null) {
instance = new PoolConnectionsManager();
}
return instance.cm;
}
public static void getPoolStats() {
PoolStats ps = instance.cm.getTotalStats();
System.out.println("Available: " + ps.getAvailable());
System.out.println("Leased: " + ps.getLeased());
System.out.println("Max: " + ps.getMax());
System.out.println("Pending: " + ps.getPending());
}
}
这是我的客户经理:
public class HttpClientManager {
private static HttpClientManager instance = null;
CloseableHttpClient client;
private HttpClientManager() {
System.out.println("Instazio nuovo oggetto HttpClientManager");
client = HttpClients.custom().setConnectionManager(PoolConnectionsManager.getConnectionManager()).build();
}
public static CloseableHttpClient getClient() {
if (instance == null) {
instance = new HttpClientManager();
}
return instance.client;
}
}
拨打电话的方法如下:
public class ConnectionTest {
public static void main(String[] args) {
Map<String, String> headers = new HashMap<String, String>();
headers.put("header1", UUID.randomUUID().toString());
Map<String, String> queryStringParameters1 = new HashMap<String, String>();
queryStringParameters1.put("myparam", "test");
ConnectionTest.doGet("http://mysite/test/my/path", headers, queryStringParameters1);
}
public static void doGet(String url, Map<String, String> headers, Map<String, String> queryStringParameters) {
CloseableHttpResponse response = null;
try {
// add query string parameters
URIBuilder builder = new URIBuilder(url);
if(queryStringParameters != null) {
for (Entry<String, String> elem : queryStringParameters.entrySet()) {
builder.setParameter(elem.getKey(), elem.getValue());
}
}
HttpGet request = new HttpGet(builder.build());
// add request headers -> never null, it must contains at least the transaction ID
for (Entry<String, String> header : headers.entrySet()) {
request.addHeader(header.getKey(), header.getValue());
}
request.setConfig(getConfig(10000));
response = HttpClientManager.getClient().execute(request);
} catch (URISyntaxException e) {
System.out.println("ERROR in doGet to set url: " + e.getMessage());
} catch (Exception e) {
System.out.println("ERROR in doGet: " + e.getMessage());
} finally {
try {
if(response != null) {
response.close();
System.out.println("Connection closed");
}
} catch (IOException e) {
System.out.println("executeCall error to close connection: " + ExceptionUtils.getStackTrace(e));
}
}
}
private static RequestConfig getConfig(int timeoutInSeconds) {
return RequestConfig.custom()
.setSocketTimeout(timeoutInSeconds)
.setConnectTimeout(timeoutInSeconds)
.build();
}
}