热门标签 | 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;
}




推荐阅读
  • 本文详细解析了Java中流的概念,特别是OutputStream和InputStream的区别,并通过实际案例介绍了如何实现Java对象的序列化。文章不仅解释了流的基本概念,还探讨了序列化的重要性和具体实现步骤。 ... [详细]
  • 本文提供了一个Android应用中用于抓取网页信息并下载图片的示例代码。通过该代码,开发者可以轻松实现从指定URL获取网页内容及其中的图片资源。 ... [详细]
  • 设计模式系列-原型模式
    一、上篇回顾上篇创建者模式中,我们主要讲述了创建者的几类实现方案,和创建者模式的应用的场景和特点,创建者模式适合创建复杂的对象,并且这些对象的每个组成部分的详细创建步骤可以是动态的变化的,但 ... [详细]
  • 本文介绍了一个基本的同步Socket程序,演示了如何实现客户端与服务器之间的简单消息传递。此外,文章还概述了Socket的基本工作流程,并计划在未来探讨同步与异步Socket的区别。 ... [详细]
  • 本文探讨了如何利用 Android 的 Movie 类来展示 GIF 动画,并详细介绍了调整 GIF 尺寸以适应不同布局的方法。同时,提供了相关的代码示例和注意事项。 ... [详细]
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
  • 优化Nginx中PHP-FPM模块配置以提升性能
    通过调整Nginx与PHP-FPM之间的配置,可以显著提高Web服务器处理PHP请求的速度和效率。本文将详细介绍如何针对不同的应用场景优化PHP-FPM的各项关键参数。 ... [详细]
  • Java 中静态和非静态嵌套类的区别 ... [详细]
  • 本文介绍了如何使用C# Winform开发局域网内的文件传输功能,详细描述了从用户界面到后端网络通信的具体实现。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • 本文详细介绍了Golang中string类型的内部结构及其特性,包括字符串的定义、表示方式、数据结构以及相关的操作方法,如字符串拼接和类型转换等。 ... [详细]
  • 本文探讨了如何选择一个合适的序列化版本ID(serialVersionUID),包括使用生成器还是简单的整数,以及在不同情况下应如何处理序列化版本ID。 ... [详细]
  • Python网络编程:深入探讨TCP粘包问题及解决方案
    本文详细探讨了TCP协议下的粘包现象及其产生的原因,并提供了通过自定义报头解决粘包问题的具体实现方案。同时,对比了TCP与UDP协议在数据传输上的不同特性。 ... [详细]
  • 将数组的所有元素递增 1 的 Java 程序 ... [详细]
  • 本文详细介绍了Java中的泛型概念及其在类、接口和方法中的应用。泛型是自JDK 1.5以来引入的一项重要特性,旨在增强代码的灵活性和安全性。 ... [详细]
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社区 版权所有