出现org.apache.http.NoHttpResponseException

2023-11-19

摘要: spring resttemplate使用httpclient4.4 连接池,出现org.apache.http.NoHttpResponseException: 10.0.0.25:8080 failed to respond异常的解决方案。以及httpclient4.4版本的连接池配置

httpclient4.4简单初始化httpclient的方式:

HttpClient httpClient = HttpClientBuilder.create().build();
        ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
        restTemplate = new RestTemplate(requestFactory);

使用连接池初始化httpclient的方式:

PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
        connManager.setMaxTotal(100);
        connManager.setDefaultMaxPerRoute(10);
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        httpClientBuilder.setConnectionManager(connManager);
        httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler());
        HttpClient httpClient = HttpClientBuilder.create().build();
        ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
        restTemplate = new RestTemplate(requestFactory);

但在测试过程中发现,有时候出现如下的异常,但重试一次就没有问题:

Caused by: org.apache.http.NoHttpResponseException: 10.0.0.25:8080 failed to respond
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:143)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)

网上查了相关的报错信息,找到官网上的描述

org.apache.commons.httpclient.NoHttpResponseException java.io.IOException +- org.apache.commons.httpclient.NoHttpResponseExceptionIn some circumstances, usually when under heavy load, the web server may be able to receive requests but unable to process them. A lack of sufficient resources like worker threads is a good example. This may cause the server to drop the connection to the client without giving any response. HttpClient throws NoHttpResponseException when it encounters such a condition. In most cases it is safe to retry a method that failed with NoHttpResponseException.

根据描述主要就是因为服务端断开连接,但并没有通知客户端,导致下次请求该服务时httpclient继续使用该连接导致报错。

查看了tomcat7的文档,发现在Connector中keepAliveTimeout可以配置连接空闲多久就关闭该连接,它的值默认是和connectionTimeout一样,而在server.xml中connectionTimeout值默认为20s。

通过验证,确实是在第一次请求20秒后,再请求就会报出NoHttpResponseException的异常。

通过查看debug日志,以上代码生成的connection默认是keep alive的,通过如下代码可以将httpclient生成的connection的alive时间可配置。

ConnectionKeepAliveStrategy connectionKeepAliveStrategy = new ConnectionKeepAliveStrategy() {
            @Override
            public long getKeepAliveDuration(HttpResponse httpResponse, HttpContext httpContext) {
                return 20 * 1000; // tomcat默认keepAliveTimeout为20s
            }
        };
        PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(20, TimeUnit.SECONDS);
        connManager.setMaxTotal(200);
        connManager.setDefaultMaxPerRoute(200);
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(10 * 1000)
                .setSocketTimeout(10 * 1000)
                .setConnectionRequestTimeout(10 * 1000)
                .build();
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        httpClientBuilder.setConnectionManager(connManager);
        httpClientBuilder.setDefaultRequestConfig(requestConfig);
        httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler());
        httpClientBuilder.setKeepAliveStrategy(connectionKeepAliveStrategy);
        HttpClient httpClient = httpClientBuilder.build();
        ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
        restTemplate = new RestTemplate(requestFactory);

主要是增加keepalive的策略,但这又带来一个问题,所有的连接只有20秒,无法使用长连接的性能优势,在查看API时发现PoolingHttpClientConnectionManager提供有

@Override
    public void closeIdleConnections(final long idleTimeout, final TimeUnit tunit) {
        if (this.log.isDebugEnabled()) {
            this.log.debug("Closing connections idle longer than " + idleTimeout + " " + tunit);
        }
        this.pool.closeIdle(idleTimeout, tunit);
    }

的方法,后续研究能否使用该API解决短链接的问题。

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

出现org.apache.http.NoHttpResponseException 的相关文章

  • async/await处理多个异步请求

    async await 处理异步操作 axios defaults baseURL http localhost 9999 async function queryData let result await axios get adata
  • 使用MyEclipse创建JSP页面的一般步骤

    一 MyEclipse下建立点 当然事先JDK以及Tomcat以及装好 在包资源管理器中 新建Web Project 站点名称 MyJSP2 选择当前站点的工作目录 默认是我们打开MyEclipse时设置的工作目录 在这里也可以修改 最好是
  • 关于写死bootargs实例

    文章目录 1 说明 2 举例 3 原理 1 说明 1 附加的内核命令行 cmdline BOARD KERNEL CMDLINE 在build core Makefile中 有以下一段内容 strip起到去除空格的作用 BOARD KERN
  • 2020-03-12 git分支

    1 git c 配置 git c
  • mysql怎么生成ER_navicat怎么生成er

    Navicat软件真是一个好东西 今天需要分析一个数据库 然后想看看各个表之间的关系 所以需要查看表与表之间的关系图 专业术语叫做ER关系图 默认情况下 Navicat显示的界面是这样的 软件将表当做一个对象 然后显示了所有的表 仅仅通过这
  • 进程同步之信号量机制(pv操作)及三个经典同步问题

    1 信号量机制 信号量机制即利用pv操作来对信号量进行处理 什么是信号量 信号量 semaphore 的数据结构为一个值和一个指针 指针指向等待该信号量的下一个进程 信号量的值与相应资源的使用情况有关 当它的值大于0时 表示当前可用资源的数
  • 将控制台内容重定向至文件

    使用os system command 等模块执行系统命令时 返回值为命令执行结果 命令执行成功返回Ture 否则返回False 若要得命令本身返回的内容 需要将命令输出至控制台的内容写到文件中 即将标准输出由控制台重定向至文件 将控制台内
  • element时间选择器的默认值

    概览 vue使用element组件 需要给时间选择器设置默认值 场景一 默认时间选择器 场景二 时间范围选择器 开始时间和结束时间 一 默认时间选择器 实现思路 element组件的v model绑定的数据变化 则时间选择器的默认值变化 可
  • element-ui对话框dialog详解

    效果展示 先给大家展示一下大致的样式 代码
  • 删除卡在C盘和D盘之间的恢复盘

    依次点击 此电脑 gt 管理 gt 磁盘管理 可以看到上图中C盘和D盘之间有一个恢复分区 导致即使删除D盘 C盘也无法进行拓展 并且中间的分区是没法右键删除的 搜索 cmd 右键以管理员方式运行 输入命令删除恢复盘 Microsoft Wi
  • element-tree树结构-默认选中第一个节点高亮-根据id选中节点高亮

    前言 tree树结构是在开发中经常使用的组件 比如区域树 楼层树 组织架构树 等等包含节点关系 实际开发可能需要我们一进到页面选中树形结构第一个节点 并且调用数据 来达到用户体验 在用户选择之后 通过本地存储的方式把楼层id存起来 刷新之后
  • 使用Docker registry镜像创建私有仓库

    2015 01 25 wcdj 摘要 安装Docker后 可以通过官方提供的registry镜像来简单搭建一套本地私有仓库环境 本文记录简单的搭建过程 1 使用registry启动私有仓库的容器 docker run d p 5000 50
  • 设计模式学习之装饰器模式

    装饰器 Decorator 模式跟适配器 Adapter 模式一样 属于构建型设计模式 在学习适配器模式的时候说过 适配器模式的重点在复用能力 装饰器模式的重点在扩展能力 换言之 装饰器模式是先复用后扩展 这也导致了很多人跟适配器模式混淆
  • SpringBoot实现原理

    一 什么是SpringBoot SpringBoot是一个快速开发框架 快速的将一些常用的第三方依赖整合 原理 通过Maven子父工程的方式 简化XML配置 全部采用注解形式 内置Http服务器 Jetty和Tomcat 最终以java应用
  • 09.09 星期一 恒指/德指/做单记录及晚盘前瞻

    今日小结 行情回顾 恒指周一早盘高开高走后快速震荡回踩一轮 企稳二次反弹至26740一线 上证开盘后二次回踩修复冲高26800一线关口 承压后快速收回涨势 维持一段时间区间震荡后承压震荡回落 第一轮跌破均线支撑26670一线 反弹部分走二次
  • Unity接入激励视频广告,Admob+UnityAds+FacebookAudienceNetwork+Pangle。

    前段时间用了两周时间接广告 后来又改用其他方式接入了 记一下接入过程 算是没白辛苦吧 2021 2 22 NRatel割 一 Admob UnityAds FacebookAudienceNetwork接入笔记 按照 https devel
  • ERROR: Could not build wheels for numpy, which is required to install pyproject.toml-based projects

    设备 树莓派4B 系统是官方的raspbian 经历 安装完OpenCV后在import cv2时报错ImportError numpy core multiarray failed to import 网上查出方案是numpy版本不适配
  • python安装第三方库搜索不了_pycharm中安装第三方库在库的搜索区提示(nohing to show)的解决办法...

    pycharm自带了包管理的功能 对于很多学习python的新手来说能从pycharm直接搜寻需要的第三方库是件很舒服的事情 最近想添加第三方库paramiko 发现通过pip安装的并不顺利 就想到了用pycharm 使用python的一大
  • 如何写uart驱动?

    最近买了个Cortex A8 想学习驱动编写 但是最简单的uart驱动不知如何编写 怎么入手呢 1 查看datasheet 找到uart地址 2 怎么转载uart驱动呢 自动转载驱动是如何实现的 是用udev吗 还是启动脚本 糊涂呀 糊涂呀
  • Linux下.py文件只读问题以及解决过程

    一 问题描述 如图 在Ubuntu Linux系统中使用pycharm管理项目文件时 无法编辑 提示文件为只读 点击 OK 后仍旧无法清除只读模式 并报错 二 问题解决 将问题定性为文件权限相关问题 在终端中打开项目文件夹 将相关 py源代

随机推荐