Http4.3工具类(连接池和非连接池实现)
来源:互联网 发布:地理空间数据云 编辑:程序博客网 时间:2024/05/16 10:02
由于之前项目数据量小,直接用的一般的http请求,后边随着数据量猛增到百万级,造成大量http请求 org.apache.http.conn.ConnectTimeoutException ,上网搜了搜,大神们说原因是http请求过多,请求占资源一直没有释放,最后导致连接失败,看了下当时的http请求代码,的确没有释放的环节,当时也没有找需要再什么地方释放了,就整体改成连接池的模式,最后问题得以解决,下边直接贴代码
http请求格式枚举:
public enum FormatType { xml(0,"text/xml"), json(1,"text/json"), appJson(2,"application/json"); FormatType(int num, String type) { this.num = num; this.formatType = type; } String formatType; int num; public int getNum() { return num; } public String getFormatType() { return formatType; } public static FormatType getFormatTypeByNum(int num) { for(FormatType formatType : FormatType.values()){ if(num == formatType.num){ return formatType; } } return null; } public void setFormatType(String formatType) { this.formatType = formatType; }}
没有使用连接池http工具类:
public class HttpUtils { private static Logger LOGGER = LoggerFactory.getLogger(HttpUtils.class); private static int DEFAULT_SOCKET_TIMEOUT = 1000 * 61; private static int DEFAULT_CONNECTION_REQUEST_TIMEOUT = 1000*61; private static int DEFAULT_CONNECTION_TIMEOUT = 1000 * 120;//这个连接时间当时报错后以为是时间设置的短,就增加到2分钟了,改完也没用 public static String getXmlHttpsResponse(String url, String params, boolean isPost, FormatType format) { return getXmlHttpsResponse(url, params, isPost, DEFAULT_SOCKET_TIMEOUT, DEFAULT_CONNECTION_REQUEST_TIMEOUT,DEFAULT_CONNECTION_TIMEOUT, format); } public static String getXmlHttpsResponse(String url, String params, boolean isPost, int socketTmeOut, int connectionRequestTimeOut, int connectionTimeOut, FormatType format) { LOGGER.info("getXmlHttpsResponse params: url={} params={}", url, params); String ret = ""; try { RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(connectionRequestTimeOut).setSocketTimeout(socketTmeOut).setConnectTimeout(connectionTimeOut).build(); CloseableHttpClient httpClient = createSSLClientDefault(url); HttpRequestBase request = isPost ? new HttpPost(url) : new HttpGet(url); if (isPost && params != null) { StringEntity entity = new StringEntity(params, "UTF-8"); entity.setContentEncoding("UTF-8"); entity.setContentType(format.getFormatType()); ((HttpPost) request).setEntity(entity); } request.setConfig(requestConfig); HttpResponse response = httpClient.execute(request); int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_OK) { HttpEntity responseEntity = response.getEntity(); ret = EntityUtils.toString(responseEntity, "UTF-8"); } else { LOGGER.error("getHttpResponse Error: StatusCode wrong,StatusLine={}", response.getStatusLine().toString()); } } catch (Throwable e) { LOGGER.error("getXmlHttpsResponse error", e); } return ret; } private static List<? extends NameValuePair> getNameValueParams(JSONObject jsonParams) { List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>(); Iterator keys = jsonParams.keys(); while (keys.hasNext()) { String key = (String) keys.next(); Object value = jsonParams.get(key); String stringValue = ""; if (value instanceof String) { stringValue = (String) value; } else { stringValue = String.valueOf(value); } params.add(new BasicNameValuePair(key, stringValue)); } return params; } public static CloseableHttpClient createSSLClientDefault(String url) { if (url != null && url.matches("https:.*?")) { try { SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { /** * 信任所有 */ @Override public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { return true; } }).build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext); return HttpClients.custom().setSSLSocketFactory(sslsf).build(); } catch (KeyManagementException e) { LOGGER.error("createSSLClientDefault Error:{}", e.getMessage()); } catch (NoSuchAlgorithmException e) { LOGGER.error("createSSLClientDefault Error:{}", e.getMessage()); } catch (KeyStoreException e) { LOGGER.error("createSSLClientDefault Error:{}", e.getMessage()); } } return HttpClients.custom().build(); } /** * 将map参数转化为url参数 Set<String> exclude 这个参数具体根据业务需求增加的,过滤某一个或者某几个字段不进行http参数构造 */ public static String getUrlParam(Object param, Set<String> exclude) { JSONObject jsonObject = JSONObject.fromObject(param); LOGGER.info("json is " + jsonObject); StringBuffer url = new StringBuffer(); // 组装参数 if (null != jsonObject) { url.append("?"); for (Object key : jsonObject.keySet()) { if (CollectionUtils.isNotEmpty(exclude) && exclude.contains(key.toString())) { continue; } try { url.append(key.toString() + "=" + URLEncoder.encode(jsonObject.get(key).toString(), "UTF-8") + "&"); } catch (Exception e) { LOGGER.error("getUrlParam", e); } } url.deleteCharAt(url.length() - 1); } return url.toString(); }}
使用连接池的http工具类:
public class HttpPoolUtils { private static final CloseableHttpClient httpClient; public static final String CHARSET_UTF8 = "UTF-8"; // 将最大连接数增加到 public static final int MAX_TOTAL = 600; // 将每个路由基础的连接增加到 public static final int MAX_ROUTE_TOTAL = 600; public static final int SOCKET_TIME = 60 * 1000; public static final int CONNECT_TIME = 60 * 1000; public static final int CONNECTION_REQUEST_TIMEOUT = 60 * 1000; private static Logger LOGGER = LoggerFactory.getLogger(HttpUtils.class); static { PoolingHttpClientConnectionManager httpClientConnectionManager = new PoolingHttpClientConnectionManager(); httpClientConnectionManager.setMaxTotal(MAX_TOTAL); httpClientConnectionManager.setDefaultMaxPerRoute(MAX_ROUTE_TOTAL); RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT).setConnectTimeout(CONNECT_TIME).setSocketTimeout(SOCKET_TIME).build(); //设置重定向策略 LaxRedirectStrategy redirectStrategy = new LaxRedirectStrategy(); httpClient = HttpClients.custom().setConnectionManager(httpClientConnectionManager).setDefaultRequestConfig(requestConfig).setRedirectStrategy(redirectStrategy).build(); }/**params string类型,需要使用下边的 getUrlParam进行转换isPost post or getformat 枚举类型 http请求具体的格式设置*/ public static String getXmlHttpsResponse(String url, String params, boolean isPost, FormatType format) { String ret = ""; HttpRequestBase request = isPost ? new HttpPost(url) : new HttpGet(url); CloseableHttpResponse response = null; try { if (isPost && params != null) { StringEntity entity = new StringEntity(params, CHARSET_UTF8); entity.setContentEncoding(CHARSET_UTF8); entity.setContentType(format.getFormatType()); ((HttpPost) request).setEntity(entity); } response = httpClient.execute(request); int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_OK) { HttpEntity responseEntity = response.getEntity(); ret = EntityUtils.toString(responseEntity, CHARSET_UTF8); EntityUtils.consume(responseEntity); } else { LOGGER.error("getHttpResponse Error: StatusCode wrong,StatusLine={}", response.getStatusLine().toString()); } } catch (IOException e) { LOGGER.error("getXmlHttpsResponse error", e); } finally { if (response != null) { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } } return ret; } /** * 将map参数转化为url参数 Set<String> exclude 这个参数具体根据业务需求增加的,过滤某一个或者某几个字段不进行http参数构造 */ public static String getUrlParam(Object param, Set<String> exclude) { JSONObject jsonObject = JSONObject.fromObject(param); LOGGER.info("json is " + jsonObject); StringBuffer url = new StringBuffer(); // 组装参数 if (null != jsonObject) { url.append("?"); for (Object key : jsonObject.keySet()) { if (CollectionUtils.isNotEmpty(exclude) && exclude.contains(key.toString())) { continue; } try { url.append(key.toString() + "=" + URLEncoder.encode(jsonObject.get(key).toString(), "UTF-8") + "&"); } catch (Exception e) { LOGGER.error("getUrlParam", e); } } url.deleteCharAt(url.length() - 1); } return url.toString(); }}
阅读全文
0 0
- Http4.3工具类(连接池和非连接池实现)
- HTTP4.3 工具类、多线程下的连接池的使用
- 连接池-DBCPUtils工具类(dbcp)
- 连接池-C3P0Utils工具类(c3p0)
- redis连接池工具类
- Redis连接池工具类
- jedis 连接池工具类具体实现demo。
- java 操作redis (非连接池)
- 数据库永久连接和非永久性连接
- HTTP非持久连接和持久连接
- HTTP非持久连接和持久连接
- 非持久连接和持久连接
- 【MongoDB】非验证连接和验证连接
- Socket实现非阻塞连接
- Socket实现非阻塞连接
- 使用连接池的数据库工具类
- Java开发Redis连接池工具类
- JDBC工具类使用C3P0连接池
- 【English】No Failure
- 楼主的文章列表
- ThinkPHP3.2.3--登录与退出登录
- 2016年蓝桥杯决赛 凑平方数
- git 分支改名
- Http4.3工具类(连接池和非连接池实现)
- 在VMware 12 Pro上安装Mac OS 虚拟机
- PHP + jquery 手机端 上传图片
- agv 路径规划move_base
- 全选js代码片段
- C++虚继承
- Android三级缓存
- 值得推荐的C/C++框架和库 (真的很强大)
- vue+express:搭建个人博客(3)