public class HttpClientUtils {
// 只创建HttpClient一个实例
private static CloseableHttpClient httpClient;
static {
// 客户端端与服务的请求配置
final RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(5 * 1000) // 客户端从服务器读取数据的timeout
.setConnectTimeout(5 * 1000) // 指客户端和服务器建立连接的timeout
.setConnectionRequestTimeout(10 * 1000) // 指从连接池获取连接的timeout
.build();
// 注册Socket连接的协议Http 和 Https
final Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", SSLConnectionSocketFactory.getSocketFactory()).build();
// 连接池
final PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
// 设置连接池的最大连接数增加
cm.setMaxTotal(200);
// 设置每个路由可分配的最大的连接数
cm.setDefaultMaxPerRoute(30);
// 空闲连接空闲时间超过指定时间,连接租借给用户前,尝试读一次服务端(超时1ms)来判断有没有失效, 默认2s
// keepalive 配置不当,有可能导致The target server failed to respond,
// 参考:https://czjxy881.github.io//java,nginx/记HttpClient的NoHttpResponse问题/
cm.setValidateAfterInactivity(2000);
// 自定义CloseableHttpClient 实例
httpClient = HttpClients.custom()
// 设置连接池管理器
.setConnectionManager(cm)
// 禁用cookie, 无状态服务可考虑;注意后端服务容器JSR 340规范,即会开启session,
// 默认过期30分钟,禁用cookie,有可能导致服务端内存溢出
.disableCookieManagement()
// 连接池不是共享模式,这个共享是指与其它httpClient是否共享
.setConnectionManagerShared(false)
// 定期回收空闲连接, 解决close_wait问题
.evictIdleConnections(10, TimeUnit.SECONDS)
.evictExpiredConnections() // 回收过期连接
// 连接存活时间,如果不设置,则根据长连接信息决定
.setConnectionTimeToLive(60, TimeUnit.SECONDS)
// 设置默认的请求参数
.setDefaultRequestConfig(requestConfig)
.useSystemProperties() // 设置使用系统参数
// 连接重用策略,即是否能keepAlive
.setConnectionReuseStrategy(DefaultConnectionReuseStrategy.INSTANCE)
// 长连接配置,即获取长连接生产多长时间
.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE)
// 设置重试次数,默认为3次;非幂等服务不建议开起来
.setRetryHandler(new DefaultHttpRequestRetryHandler(0, false))
.build();
}
}
HttpClient
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 因为工作需要,要使用Java代码模拟登录过程,抓取某系统的订单数据; 上网查询资料,发现使用HttpClient可...
- HttpClient程序包是一个实现了 HTTP 协议的客户端编程工具包,要想熟练的掌握它,必须熟悉 HTTP协议...
- 在API 23中,Google已经移除了移除了Apache HttpClient相关的类 。谷歌推荐使用HttpU...
- 今天在看项目的pom的时候,发现里面有这么两个包依赖。<dependency> <groupId>commons-...