Apache HttpClient 4.5:是管理连接池的正确方法吗?

时间:2019-12-19 17:02:12

标签: java httpclient

我第一次使用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();
    }
}

0 个答案:

没有答案