热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么httpclient老是卡住

最近在修改快门下载功能时,发现同一文件只能下载成功2次,此后再点下载就没反应了。我的httpclient是如下方式创建的,使用了连接池。privatestaticClose

最近在修改快门下载功能时,发现同一文件只能下载成功2次,此后再点下载就没反应了。

我的httpclient是如下方式创建的,使用了连接池。

private static CloseableHttpClient httpclient = HttpClientBuilder.create().build();

我的调用方式如下:

public static byte[] executeQuery(String url, String chartSet) throws ClientProtocolException, IOException {
        if (StringUtil.isBlank(chartSet)) {
            chartSet = "UTF-8";
        }
        byte[] bytes = null;
        HttpGet httpget = new HttpGet(url);
        HttpResponse respOnse= httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
		InputStream instream = entity.getContent();
		bytes = FileUtil.readAsByteArray(instream); 
        }
        return bytes;
}

尝试几次后发现,下载成功的次数和maxConnPerRoute相同,该参数默认值就是2,并且可以采用以下方式修改:

private static CloseableHttpClient httpclient = HttpClientBuilder.create().setMaxConPerRoute(5).build();

于是,我怀疑是连接没有释放。但我又不可能调用httpclient.close(),否则连接池就失效了。

最终发现,错误原因是我既没有释放instream,也没有释放httpget(http://www.oschina.net/question/925814_131284)。

那么,可以通过释放instream或httpget的方法来解决。

方案一:释放instream

public static byte[] executeQuery(String url, String chartSet) throws ClientProtocolException, IOException {
        if (StringUtil.isBlank(chartSet)) {
            chartSet = "UTF-8";
        }
        byte[] bytes = null;
        HttpGet httpget = new HttpGet(url);
        HttpResponse respOnse= httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
		InputStream instream = entity.getContent();
		bytes = FileUtil.readAsByteArray(instream); 
                // Closing the input stream will trigger connection release
                instream.close();
        }
	return bytes;
}

方案二:释放httpget
public static byte[] executeQuery(String url, String chartSet) throws ClientProtocolException, IOException {
        if (StringUtil.isBlank(chartSet)) {
            chartSet = "UTF-8";
        }
        byte[] bytes = null;
        HttpGet httpget = new HttpGet(url);
        HttpResponse respOnse= httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
		InputStream instream = entity.getContent();
		bytes = FileUtil.readAsByteArray(instream); 
        }
	// release links
	httpget.releaseConnection();
	return bytes;
}




推荐阅读
  • 缓存的重要性就不用再强调了,@OutputCache给我们提供了一种声明的方式(对应的还有编程的方式)来控制页面和用户控件的缓存策略,这是一种最简单直接的网站优化方式。还是先来过一遍@ ... [详细]
  • 接上文http:blog.itpub.net29254281viewspace-1318239领导让开发同学鼓捣一个可配置化的后台.又回到了原来的问题如果要灵活,很多参数要 ... [详细]
  • post请求,携带json对象参数模拟获取tokenpublicstaticStringgetToken()throwsIOException{创建连接CloseableHttp ... [详细]
  • 【Modbus 】Modbus 协议
    Modbus协议简介Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。标准的Modbus协议物理层接口有RS232、RS422 ... [详细]
  • 为什么需要有应用层缓冲区?muduo网络库使用IO复用,并且文件描述符使用非阻塞模式,如果使用阻塞模式那么read、write就会阻塞在 ... [详细]
  • Logistic回归主要针对输入的数据是多个,输出则是有限的数值型,多为2个分类。涉及到以下方面:1.输出yw0+w1*x1+w2*x2+..(x1,x2,是样本的 ... [详细]
  • 稀松数组
    稀松数组1.稀松数组什么?在一个数组中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该数组为稀疏数组;如图,一个5*5的数组arr上只有3个有效数值 ... [详细]
  • 1、为什么要对nginx平滑升级随着nginx越来越流行,并且nginx的优势也越来越明显,nginx的版本迭代也来时加速模式,1.9. ... [详细]
  • 利用原始socket简单实现FTP的客户端和服务器端程序
    1.设计目的本设计旨在利用原始socket简单实现FTP(FileTransferProtocol,文件传输协议)的客户端和服务器端程序,能够实现get、put、pwd、dir、cd等基 ... [详细]
  • php实现中文文件下载
    php教程|PHP源码php实现中文文件下载php教程-PHP源码php代码爱之谷2015源码,ubuntu16桌面,tomcat9解压缩半,python爬虫带页面,php批量删除 ... [详细]
  • *Copyright(c)2016,烟台大学计算机与控制工程学院Allrightsreserved.文件名称:字符串加密.cpp作者:彭友程完成日期&# ... [详细]
  • 1.方法一:采用OleDB读取EXCEL文件:把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下:publicDa ... [详细]
  • Java学习日志(241网络编程自定义服务端与客户端)
    为什么80%的码农都做不了架构师?自定义服务端*演示客户端与服务端客户端:浏览器服务端:自定义*importjava.net.*;importjava ... [详细]
  • php视频点播系统的简单介绍
    本文目录一览:1、phpvod管理员是什么 ... [详细]
  • 本文目录一览:1、java中几种解析html的工具 ... [详细]
author-avatar
郭建将_683
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有