首页 > 解决方案 > Apacha HttpClient 配置

问题描述

我目前RestTemplate在我的网络服务器中使用由 Apache http 客户端 4.5.6 支持来发出 http 请求。我的HttpClient配置如下:

PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();

        connectionManager.setMaxTotal(httpConfigurationProperties.getConnection().getMaxTotal());
        connectionManager.setDefaultMaxPerRoute(httpConfigurationProperties.getConnection()

        return HttpClients.custom()
                .setDefaultRequestConfig(RequestConfig
                    .custom()
                    .setConnectionRequestTimeout((int) httpConfigurationProperties.getTimeout().getConnectionRequestTimeout().toMillis())
                    .setConnectTimeout((int) httpConfigurationProperties.getTimeout().getConnectTimeout().toMillis())
                    .setSocketTimeout((int) httpConfigurationProperties.getTimeout().getReadTimeout().toMillis())
                    .build())
                .setRetryHandler(StandardHttpRequestRetryHandler.INSTANCE)
                .setConnectionManager(connectionManager)
                .build();

当我进行 HTTP GET 时,有时我会看到:

处理对 {s}-> 的请求时捕获的 I/O 异常 (java.net.SocketException):连接重置

我在另一篇文章中读到这是由服务器(我正在向其发送请求)关闭连接而不通知客户端引起的。并且StandardHttpRequestRetryHandler能够重试。但是 HTTP POST 方法不会重试,因为它们不是幂等操作。但是有没有一种配置可以首先避免这种连接重置?

我试过使用evictExpiredConnections但没有帮助。设置connectionManager.setValidateAfterInactivity(20000)是否有助于在使用前验证连接?

在使用我使用SimpleClientHttpRequestFactory的apache http 客户端之前RestTemplate,我从未遇到过连接重置问题。任何帮助表示赞赏

标签: apache-httpclient-4.xapache-httpcomponents

解决方案


推荐阅读