HttpClient release connection 该放手的时候必须放手

2023-11-04

Apache commons 系列的HttpClient 相信大家都用过,选择它而非JDK 的java.net.HttpURLConnection ,是为了使用HttpClient 封装的几个实用的功能。

目前使用最多的版本还是httpclient-3.x ,在官网http://hc.apache.org/httpclient-3.x/tutorial.html 有这么一段示例代码:

import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
import org.apache.commons.httpclient.params.HttpMethodParams;

import java.io.*;

public class HttpClientTutorial {
  
  private static String url = "http://www.apache.org/";

  public static void main(String[] args) {
    // Create an instance of HttpClient.
    HttpClient client = new HttpClient();

    // Create a method instance.
    GetMethod method = new GetMethod(url);
    
    // Provide custom retry handler is necessary
    method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
    		new DefaultHttpMethodRetryHandler(3, false));

    try {
      // Execute the method.
      int statusCode = client.executeMethod(method);

      if (statusCode != HttpStatus.SC_OK) {
        System.err.println("Method failed: " + method.getStatusLine());
      }

      // Read the response body.
      byte[] responseBody = method.getResponseBody();

      // Deal with the response.
      // Use caution: ensure correct character encoding and is not binary data
      System.out.println(new String(responseBody));

    } catch (HttpException e) {
      System.err.println("Fatal protocol violation: " + e.getMessage());
      e.printStackTrace();
    } catch (IOException e) {
      System.err.println("Fatal transport error: " + e.getMessage());
      e.printStackTrace();
    } finally {
      // Release the connection.
      method.releaseConnection();
    }  
  }
}

大部分人也是以这个为规范来使用的,但是注意有一段关于“Release the Connection”的说明:

This is a crucial step to keep things flowing. We must tell HttpClient that we are done with the connection and that it can now be reused. Without doing this HttpClient will wait indefinitely for a connection to free up so that it can be reused.
我看得也不是很明白,意思是我们必须在使用后调用

method.releaseConnection();
来告诉HttpClient 这个连接可以重用了。

这个在串行的处理中或许很有用,但是我所遇到的情况是多线程并发下,不能共享同一个HttpClient 实例,按照官方示例写好代码后,程序跑起来似乎没什么问题,但是随着时间的累计,有一天突然发现这个模块不工作了,查看了一下当前的网络连接,这个java 程序同一个地址保持着200多个CLOSE_WAIT 的连接,好吧,连接没有释放。

为什么没有释放?查看doc,有这样的说明:

Releases the connection being used by this HTTP method. In particular the connection is used to read the response(if there is one) and will be held until the response has been read. If the connection can be reused by other HTTP methods it is NOT closed at this point.

注意最后一句,如果该连接可以重用则不关闭,是“可以重用”,当然可以重用了,就在那儿等着我去重用,可是我都是新建的实例,怎么重用

查看源码,找到HttpClient 的构造方法,有一个可以指定HttpConnectionManager ,然后这个HttpConnectionManager 又有一个实现的构造:

public SimpleHttpConnectionManager(boolean alwaysClose)
The connection manager created with this constructor will try to keep the connection open (alive) between consecutive requests if the alwaysClose parameter is set to false. Otherwise the connection manager will always close connections upon release.
Parameters:
alwaysClose - if set true, the connection manager will always close connections upon release.

显然alawaysClose 的默认值是false ,在释放后连接并不总是会关闭。

所以,必须

HttpClient client = new HttpClient(new HttpClientParams(),new SimpleHttpConnectionManager(true));

当然,还有其它的解决方案,找到了一篇文章总结的比较全面: HttpClient容易忽视的细节——连接关闭

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HttpClient release connection 该放手的时候必须放手 的相关文章

随机推荐

  • 电脑桌面的word文件丢失了怎么找回?7个解决方法!

    word作为日常办公的文字处理软件 能够满足用户的各种文档处理需求 而在电脑长期使用过程中 难免会因为各种原因导致word文件丢失 那么电脑桌面的word文件丢失了怎么找回呢 针对用户的这个疑惑 下面以win10电脑系统为例 小编就来跟大家
  • 未来五年NFV增长率将达55%

    市场研究机构ABI Research发布的最新数据显示 2017年 2022年期间 网络功能虚拟化软件市场增长率将达到55 同时网络功能虚拟化服务将增长50 同期的硬件支出将下降 在欧洲 整个市场预测期内的年均复合增长率将达到53 但北美地
  • 【git】Github 上的 markdown 文件怎么上传并显示图片?

    要在GitHub上的Markdown文件中上传图片 可以使用以下步骤 一 上传图像文件夹 将图片上传到GitHub仓库中 你可以在仓库中创建一个文件夹 专门用于存储图片 二 在Markdown文件中插入图片 在Markdown文件中插入图片
  • win mac 双系统 opencore 硬盘引导_奶白MacOS+WIN 10双系统主机安装记录

    暑假地时候就计划要组装一台MacOS WIN 10双系统纯白主机 折腾了三个月 终于完美完成了主机的安装 配置单 处理器 Intel i7 10700K 主板 七彩虹CVN Z490 GAMING FROZEN V20 显卡 影驰 RTX2
  • VMware虚拟机的配置与Linux的安装

    VMware虚拟机的配置与Linux的安装 在这里使用的是VMware15版本和CentOS 7 x86 64 Minimal VMware虚拟机压缩包以及CentOS 7 x86 64 Minimal需要的点击下载 下面我们进行VMwar
  • tomcat配置通过域名访问,并且不加端口和项目名称

    废话不多说 直接上代码 首先tomcat的路径 打开server xml并在
  • 前端课设 网页设计期末作业-静态网页(下载链接在文末)

    网页设计期末作业 网站详情如下图所示 点我下载 https mp csdn net mp download manage download UpDetailed
  • ch4_7 确认字符串中的重复子串

    leetcod 459 重复的子字符串 给定一个非空的字符串 s 检查是否可以通过由它的一个子串重复多次构成 示例 1 输入 s abab 输出 true 解释 可由子串 ab 重复两次构成 1 关键点分析 使用KMP 中构造出 最大相同前
  • 数据分析利器Jupyter notebook入门手册

    公众号 尤而小屋作者 Peter编辑 Peter 大家好 我是Peter 很多读者问过我 Peter文章中的Python代码都是用的什么编辑器写的 今天就公开啦 Jupyter Notebook 没有Pycharm 没有Vscode 没有S
  • python粘性扩展_1. 使用 C 或 C++ 扩展 Python

    1 12 给扩展模块提供C API 很多扩展模块提供了新的函数和类型供Python使用 但有时扩展模块里的代码也可以被其他扩展模块使用 例如 一个扩展模块可以实现一个类型 collection 看起来是没有顺序的 就像是Python列表类型
  • Linux国际化设置locales

    更新国际话文件时 yan yan laptop var lib locales supported d sudo locale gen Generating locales en AG UTF 8 done en AU UTF 8 done
  • jQuery的筛选器

    jQuery的筛选器 用在jQuery选择的元素集合的后面 都是方法 为了对已经选择出来的元素进行二次筛选 筛选器 1 first gt 筛选集合里面的第一个元素 2 last gt 筛选集合里面的最后一个元素 3 eq n gt 筛选集合
  • openGL之API学习(五十六)低模、高模的区别以及各自的使用领域

    高模是高细节高精度的3D模型 高模看上去十分逼真细节非常丰富模型的面数也相当的高 低模是游戏里的说法 可以理解为游戏所使用的模型 高模有很多作用可以用于电影制作 广告等等 在游戏里高模主要是为了烘焙NormalMap 并且运用在游戏低模型上
  • Antd a-tree 树形控件,选中的节点高亮。

    实现最简单的树展示列表 效果图 template中
  • javaWeb

    1 基本概念 Web开发 静态网页 提供给所有人看的数据始终不会发生变化 动态网页 提供给所有人看的数据始终会发生变化 每个人在不同的时间 不同的地点看到的信息各不相同 在java中 动态Web资源开发的技术统称为javaWeb web应用
  • 脑电信号EEG分类基础入门(1)机器学习编程环境搭建

    网上大多数资料都是基于python语言的 我的编程环境和工程都是python 但也会用matlab来可视化理解 用到的安装包和代码资料已经整理好了 https download csdn net download fzf1996 21484
  • Linux学习笔记:用fdisk工具分区,swap分区的管理

    1 什么是MBR 什么是分割表 MBR master boot record 即硬盘的主引导记录 分割表 partition table 即硬盘的分区表 在系统关机时 硬盘内的磁盘上的磁头会回到整个磁盘的第一个扇区 当再次启动系统时 磁头会
  • ccwow服务器维护,牧师 - 军团再临 - 178魔兽世界

    牧师职业大厅 军团再临资料片中最大的改动便是神器和职业大厅了 如同德拉诺版本的要塞系统一样 7 0的职业大厅便像是一个强化版的要塞 不过在这里你不再是一个人 相同职业的玩家都会和你在一起来共同探索破碎群岛对抗燃烧军团 那让我们走进虚空之光神
  • calico固定podip

    实现方法 利用calico组件的两个kubernetes注解 1 gt cni projectcalico org ipAddrs 2 gt cni projectcalico org ipv4pools 场景1 单个pod固定ip 利用c
  • HttpClient release connection 该放手的时候必须放手

    Apache commons 系列的HttpClient 相信大家都用过 选择它而非JDK 的java net HttpURLConnection 是为了使用HttpClient 封装的几个实用的功能 目前使用最多的版本还是httpclie