当前位置: 首页 > news >正文

httpClient超时时间详解与测试案例

使用httpclient作为http请求的客户端时,我们一般都会设置超时时间,这样就可以避免因为接口长时间无响应或者建立连接耗时比较久导致自己的系统崩溃。通常它里面设置的几个超时时间如下:

RequestConfig config = RequestConfig.custom().setConnectionRequestTimeout(3000).setConnectTimeout(3000).setSocketTimeout(3000).build();

setConnectionRequestTimeout():从httpclient连接池中获取连接的超时时间,如果连接池中的连接都被占用,那么超过该时间还未获取到连接就会抛出异常。
setConnectTimeout():建立连接发生三次握手时的超时时间,如果超过该设置的时间连接还未建立成功就会抛出异常。
setSocketTimeout():读取数据超时时间,注意这个时间不是接口响应耗时时间,是接口返回数据两次数据包之间间隔时间,如果超过这个时间间隔还没有新的数据返回,那么就会抛出异常。

下面就分别测试三种超时时间:
在测试超时时间前,需要创建一个接口用于请求:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.TimeUnit;/*** 测试接口* * @Author xingo* @Date 2023/11/15*/
@RestController
public class DemoController {@GetMapping("/demo1")public String socketTimeout() throws InterruptedException {TimeUnit.MILLISECONDS.sleep(5000);return "ok";}@GetMapping("/demo2")public void socketTimeout2(HttpServletResponse response) throws InterruptedException, IOException {for (int i = 0; i < 10; i++) {System.out.println(i);response.getWriter().print(i);response.flushBuffer();TimeUnit.MILLISECONDS.sleep(800);}}
}
  1. 从连接池获取连接超时:
    要想测试连接超时时间,需要调整连接池大小,有关连接池配置请参考:httpclient工具类封装 ,这里有两个参数:
// 连接池配置
PoolingHttpClientConnectionManager poolingManager = new PoolingHttpClientConnectionManager(sf);
// 最大连接数
poolingManager.setMaxTotal(2);
// 每个路由最大连接数
poolingManager.setDefaultMaxPerRoute(2);

将两个连接池参数调整为2个,这样就可以很快达到线程池大小,设置一段循环代码一直请求上面的耗时接口:http://localhost:8081/demo1 。测试代码如下:

/*** @Author xingo* @Date 2023/11/15*/
public class TestHttpUtils {public static void main(String[] args) {final String url = "http://localhost:8081/demo1";for(int i = 0; i < 10; i++) {new Thread(() -> {HttpResult result = HttpUtils.getInstance().doGet(url, null, null, "UTF-8", 10000, 1000, 100);System.out.println(result.getBody());}, "thread-" + i).start();}}
}

这里面从连接池中获取连接超时时间设置为100ms,而请求响应耗时是5s,这样很快就会达到线程池大小而不会返回连接,这个测试代码会抛出如下异常:

org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from poolat org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:316)at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:282)at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190)at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)at org.example.config.HttpUtils.doGet(HttpUtils.java:677)at org.example.config.TestHttpUtils.lambda$main$0(TestHttpUtils.java:22)at java.lang.Thread.run(Thread.java:748)

所以当项目中的请求并发量比较大,而且耗时较久时就需要调整几个参数:第一个就是连接池大小和单个路由的连接数量;第二个就是要调整从连接池中获取连接的超时时间,避免获取连接超时。

  1. 建立连接超时
    建立连接超时一般是服务端无响应或者服务端无法快速建立连接导致的三次握手超时,这时候就会抛出连接超时异常,如我们调整连接地址为:http://localhost:8082/demo1 。这是一个根本不存在的服务,这时调整测试代码:
/*** @Author xingo* @Date 2023/11/15*/
public class TestHttpUtils {public static void main(String[] args) {final String url = "http://localhost:8082/demo1";HttpResult result = HttpUtils.getInstance().doGet(url);System.out.println(result.getBody());}
}

这时就会抛出建立连接异常:

org.apache.http.conn.HttpHostConnectException: Connect to localhost:8082 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connectat org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:156)at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)at org.example.config.HttpUtils.doGet(HttpUtils.java:677)at org.example.config.HttpUtils.doGet(HttpUtils.java:584)at org.example.config.TestHttpUtils.main(TestHttpUtils.java:11)
Caused by: java.net.ConnectException: Connection refused: connectat java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)at java.net.Socket.connect(Socket.java:589)at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:75)at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)... 12 more
  1. 响应超时
    响应超时是获取服务端返回数据超时,但是这里的超时不是服务端返回数据整个过程超时,而是返回两个数据包之间的时间间隔超过设置的超时时间。
    测试的第二个接口返回数据分多次输出,每次输出数据间隔是800ms,整个响应耗时是8s。第一次测试设置超时时间是1s,超过两次时间间隔,这时不会发生读取数据超时:
/*** @Author xingo* @Date 2023/11/15*/
public class TestHttpUtils {public static void main(String[] args) {final String url = "http://localhost:8081/demo2";HttpResult result = HttpUtils.getInstance().doGet(url, 1000);System.out.println(result.getBody());}
}

结果正常输出:0123456789
如果将超时时间设置为500ms,就会发生读取数据超时异常:

java.net.SocketTimeoutException: Read timed outat java.net.SocketInputStream.socketRead0(Native Method)at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)at java.net.SocketInputStream.read(SocketInputStream.java:171)at java.net.SocketInputStream.read(SocketInputStream.java:141)at org.apache.http.impl.conn.LoggingInputStream.read(LoggingInputStream.java:84)at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)at org.apache.http.impl.io.ChunkedInputStream.getChunkSize(ChunkedInputStream.java:261)at org.apache.http.impl.io.ChunkedInputStream.nextChunk(ChunkedInputStream.java:222)at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:183)at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:135)at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)at java.io.InputStreamReader.read(InputStreamReader.java:184)at java.io.Reader.read(Reader.java:140)at org.apache.http.util.EntityUtils.toString(EntityUtils.java:227)at org.apache.http.util.EntityUtils.toString(EntityUtils.java:270)at org.apache.http.util.EntityUtils.toString(EntityUtils.java:290)at org.example.config.HttpUtils.doGet(HttpUtils.java:680)at org.example.config.HttpUtils.doGet(HttpUtils.java:594)at org.example.config.TestHttpUtils.main(TestHttpUtils.java:11)

以上三个超时时间就是在使用apache的httpclient时需要注意的,避免因为设置错误导致程序崩溃。

相关文章:

httpClient超时时间详解与测试案例

使用httpclient作为http请求的客户端时&#xff0c;我们一般都会设置超时时间&#xff0c;这样就可以避免因为接口长时间无响应或者建立连接耗时比较久导致自己的系统崩溃。通常它里面设置的几个超时时间如下&#xff1a; RequestConfig config RequestConfig.custom().setCo…...

后端接口性能优化分析-数据库优化

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…...

都很忙,哪里寻找时间?

最近忙不&#xff1f; 多久未联系的朋友发来信息。 我感觉就是一坑。 说忙吧&#xff0c;显得自己很重要&#xff0c;可说不忙吧&#xff0c;又显得没价值。 有事说事&#xff0c;不要上来就说“在不&#xff1f;忙不&#xff1f;有时间不&#xff1f;空不&#xff1f;”等…...

【经验记录】Ubuntu系统安装xxxxx.tar.gz报错ImportError: No module named setuptools

最近在Anaconda环境下需要离线状态&#xff08;不能联网的情况&#xff09;下安装一个xxxxx.tar.gz格式的包&#xff0c;将对应格式的包解压后&#xff0c;按照如下命令进行安装 sudo python setup.py build # 编译 sudo python setup.py install # 安装总是报错如下信息&am…...

SDL2 消息循环和事件响应

1.简介 SDL事件可以是用户输入、系统通知或窗口管理事件等。SDL事件可以通过SDL_PollEvent和SDL_WaitEvent函数来获取。在SDL中&#xff0c;事件是通过SDL_Event结构体表示的&#xff0c;其中包含事件类型以及与该类型相关的具体数据。 下面是一些常见的SDL事件类型和相关的事…...

技巧篇:Mac 环境PyCharm 配置 python Anaconda

Mac 中 PyCharm 配置 python Anaconda环境 在 python 开发中我们最常用的IDE就是PyCharm&#xff0c;有关PyCharm的优点这里就不在赘述。在项目开发中我们经常用到许多第三方库&#xff0c;用的最多的命令就是pip install 第三方库名 进行安装。现在你可以使用一个工具来帮你解…...

matplotlib绘图

介绍 在官网上有更多种类的图型的绘制方法 matpoltlib中文官方文档&#xff1a;例子_Matplotlib 中文网 matpoltlib英文官方文档&#xff1a;Examples — Matplotlib 3.8.1 documentation 分类 一、折线图 1、要实现的功能&#xff1a; 2、实例&#xff1a; # 导入包 from…...

QT使用Socket与安卓Socket互发消息

背景:安卓设备通过usb网络共享给Linux,此时安卓设备与linux处于同一网络环境,符合使用socket的条件,linux做客户端,安卓做服务端 1.QT使用Socket (1).在工程文件中加入 QT network (2).导包以及写一些槽函数用做数据传输与状态接收 #ifndef MAINWINDOW_H #define MAINWINDOW…...

Redis05-集群方案

目录 Redis集群方案 主从复制 主从复制的基本原理 主从复制的工作流程 乐观复制 主从复制的优势 哨兵机制 哨兵的关键作用 服务状态监控 哨兵选举Master规则 分片集群 分片集群中的数据读写 数据写入 数据读取 一致性哈希和客户端分片 Redis集群方案 微服务时代…...

故障演练的关键要素及重要性

故障演练是一种有计划的、模拟真实生产环境故障的活动。通过故意引入故障、模拟系统组件失效或模拟其他异常条件&#xff0c;团队可以观察并评估系统在这些情况下的反应。这有助于发现潜在的问题、改进应急响应和提高系统整体的可用性。 一、故障演练的关键要素 计划性&#xf…...

11月15日,每日信息差

今天是2023年11月15日&#xff0c;以下是为您准备的12条信息差 第一、去哪儿正式启动鸿蒙原生应用开发 第二、最高支持千亿向量规模&#xff0c;腾讯云向量数据库全面升级&#xff0c;同时和信通院一起联合50多家企业共同发布了国内首个向量数据库标准&#xff0c;推进向量数…...

java-关于alibaba的JSON.parseArray注意事项

String resultStr dataStrJosnObject.get("result").toString();JSONArray resultArray JSON.parseArray(resultStr);resultStr 格式是[{},{},{}] resultArray 的size是3 获取第一个{}字符串&#xff0c;使用resultArray.get(0) 获取第二哥个{}字符串&#xff0c;使…...

软文推广中媒体矩阵的优势在哪儿

咱们日常生活中是不是经常听到一句俗语&#xff0c;不要把鸡蛋放在同一个篮子里&#xff0c;其实在广告界这句话也同样适用&#xff0c;媒介矩阵是指企业在策划广告活动时&#xff0c;有目的、有计划的利用多种媒体进行广告传播&#xff0c;触达目标用户。今天媒介盒子就来和大…...

xss总结

xss注入总结 漏洞描述 XSS&#xff08;跨站脚本攻击&#xff09;是一种常见的网络安全漏洞&#xff0c;攻击者利用该漏洞在网页中插入恶意脚本&#xff0c;以获取用户的敏感信息或执行恶意操作。 XSS中文叫做跨站脚本攻击&#xff08;Cross-site scripting&#xff09;&…...

【MySQL学习】常见命令

数据库操作 &#xff08;1&#xff09;查询所有数据库名字 show databases;&#xff08;2&#xff09;常见数据库 create database db_name; //create if exist create database if exists databaseName;&#xff08;3&#xff09;删除数据库 drop database db_name;表格操…...

汽车ECU的虚拟化技术初探(二)

目录 1.概述 2.U2A虚拟化方案概述 3.U2A的虚拟化功能概述 4.虚拟化辅助功能的使能 5.留坑 1.概述 在汽车ECU的虚拟化技术初探(一)-CSDN博客里&#xff0c;我们聊到虚拟化技术比较关键的就是vECU的虚拟地址翻译问题&#xff0c;例如Cortex-A77就使用MMU来进行虚实地址的转换…...

vue3 el-menu初始化时选中没有高亮的问题(default-active和index的问题)

首先看官方文档的示例&#xff1a; 需要注意的是&#xff1a; 1、default-active的值是字符串&#xff0c;那么index绑定的值也要是字符串&#xff0c;且数字对应。不能default-avtive绑定的是1&#xff0c;而menu-item的index绑定的是45 2、default-active的值是当前选中me…...

Vue的class、style绑定

Vue中的样式也要回到原始的BOMDOMjs的前端组合去解读。 1、当模板直接引用style中定义的样式时&#xff0c;在HTML模板中按照正常的样式引用处理即可。 模板定义&#xff1a;<template> <div class"sizeclass">100</div> </template><st…...

day22_mysql

今日内容 零、 复习昨日 一、MySQL 一、约束 1.1 约束 是什么? 约束,即限制,就是通过设置约束,可以限制对数据表数据的插入,删除,更新 怎么做? 约束设置的语法,大部分是 create table 表名( 字段 数据类型(长度) 约束, 字段 数据类型(长度) 约束 );1.1 数据类型 其实数据类型…...

【VBA】基于EXCEL生成Insert语句工具

前言 基于Excel生成INSERT语句工具是为了解决在数据库中插入大量数据时手动编写INSERT语句繁琐和耗时的问题而开发的辅助工具。在软件开发和数据库管理等领域&#xff0c;测试数据是非常重要的&#xff0c;它可以用于测试和验证数据库的性能、功能和准确性。 手动编写INSERT语…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...