HttpClientUtils

package com.example.http_thread.util;

import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.ServiceUnavailableRetryStrategy;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.protocol.HttpContext; import javax.net.ssl.SSLException;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.UnknownHostException; public class HttpClientUtil {
private static PoolingHttpClientConnectionManager cm = null; static {
cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(200);//多线程调用注意配置,根据线程数设定
cm.setDefaultMaxPerRoute(300);
} public static CloseableHttpClient getHttpClient() { HttpRequestRetryHandler httpRequestRetryHandler=new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException e, int i, HttpContext httpContext) {
//Date date=new Date();
System.out.println("try httpRequestRetryHandler o: " +i); if (i >= 10000) {
// Do not retry if over max retry count
return false;
}
if (e instanceof InterruptedIOException) {
// Timeout
return true;
}
if (e instanceof UnknownHostException) {
// Unknown host
return false;
}
if (e instanceof ConnectTimeoutException) {
// Connection refused
return true;
}
if (e instanceof SSLException) {
// SSL handshake exception
return false;
}
HttpClientContext clientContext = HttpClientContext.adapt(httpContext);
HttpRequest request = clientContext.getRequest();
boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
if (idempotent) {
// Retry if the request is considered idempotent
return true;
}
return false; }
};
CloseableHttpClient httpClient = HttpClients.custom().setRetryHandler(httpRequestRetryHandler)
.setConnectionManager(cm)
.build();
return httpClient;
}
}

如何配置使用

@Test
void testThreads() {
String url = "*********************************";
CloseableHttpClient client = HttpClientUtil.getHttpClient();
HttpGet request = new HttpGet(url);
CloseableHttpResponse response = null;
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(20000)//数据传输过程中数据包之间间隔的最大时间
.setConnectTimeout(200000)//连接建立时间,三次握手完成时间
.setExpectContinueEnabled(true)//重点参数
.setConnectionRequestTimeout(60000)
.setStaleConnectionCheckEnabled(true)//重点参数,在请求之前校验链接是否有效
.build();
request.setConfig(requestConfig);
System.out.println("111111111111111111111111111111111111");
try {
response = client.execute(request);
System.out.println("22222222222222222222222222222222");
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
System.out.println("请求失败");
}
HttpEntity resEntity = response.getEntity();
if (resEntity == null) {
System.out.println("No Response");
}
String result = EntityUtils.toString(resEntity, "UTF-8");
} catch (Exception e) {
System.out.println("0123123312"+e.getMessage()+e.getClass());
}
finally {
if (response != null) {
try {
//此处调优重点,多线程模式下可提高性能。
EntityUtils.consume(response.getEntity());//此处高能,通过源码分析,由EntityUtils是否回收HttpEntity
response.close();
} catch (IOException e) {
System.out.println("关闭response失败:" + e);
}
}
}
}

最新文章

  1. Ubuntu下利用Mono,Jexus搭建Asp.Net(MVC) Web服务器
  2. 初学JavaScript
  3. 后进先出 stack、 先进先出Queue
  4. maven仓库使用
  5. sql server 如何在一个数据库中操作另一个数据库中的数据
  6. HDU 4493 Tutor(精度处理)
  7. module.xml 快捷代码
  8. Sharepoint中有关文件夹的操作
  9. Android - 通过Intent启动Activity
  10. Registry Workshop(注册表编辑器) V4.6.3 官方中文版
  11. KNN算法--物以类聚,人以群分
  12. 解决:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'requestMap.maintenancename != null and requestMap.maintenance
  13. Perl进程间通信
  14. nginx+ftp服务器搭建简易文件服务器
  15. jQuery 短信验证码倒计时
  16. wpf 状态栏图标背景闪烁提醒 FlashWindowEx
  17. Maven学习总结(11)——Maven Tomcat7自动部署
  18. 前端 HTML form表单标签 textarea标签 多行文本
  19. HDU 1465 不容易系列之一
  20. Threadlocal 传递参数(百度二面)

热门文章

  1. Openmp Runtime 库函数汇总(下)——深入剖析锁🔒原理与实现
  2. Python调用Openstack API
  3. R数据分析:孟德尔随机化中介的原理和实操
  4. 基于Apache Hudi 构建Serverless实时分析平台
  5. SpringMVC的数据绑定与视图解析
  6. Symbol详解
  7. Winform程序制作安装包
  8. WHAT IS PPM Encoder ?
  9. Canvas:绘制矩形
  10. PyOpenGL的安装与错误解决