Vertx中HttpClient的setTimeout坑
问题描述:
因为特殊原因,导致某一时间段的请求全部超时,当网络恢复正常后,后续的请求还是会继续超时,且服务端也不能再收到任务消息,只能重启客户端服务器。
代码贴示:
private static HttpClientHolder clientHolder = new HttpClientHolder();
public static HttpClient getHttpClient() {return clientHolder.get(VertxInstance.getInstance().getVertx(),() -> new HttpClientOptions().setMaxPoolSize(ConfigManager.DEFAULT.getInteger(WebGlobals.SECTION_NAME,"maxPool", 10));
}private static void pushMsgToWebServer(JsonObject pushMsgRequest) {HttpClient client = getHttpClient();// Specify both port and host nameHttpClientRequest clientRequest = client.post(WebGlobals.PORT, WebGlobals.HOST,WLGlobals.CALLBACK_URL_PATH, response -> {...});clientRequest.exceptionHandler(e -> {logger.error(String.format("pushMsgToWebServer response exception:%s", e));});clientRequest.setTimeout(30000);......
}
原因说明:
首先我们需要理解HttpClient创建连接过程原理:池+队列,setMaxPoolSize是创建一个连接池,还有一个未使用方法setMaxWaitQueueSize用于创建队列大小(默认-1,表示无限大)。
当池被用完之后,新的请求会放入队列里等待。那么如果池的链接一直不归还(closed)那么后面新来的包括已经在等待的则无法被执行。
然后我们再看setTimeout()这个方法源码:
public synchronized HttpClientRequest setTimeout(long timeoutMs) {cancelOutstandingTimeoutTimer();currentTimeoutMs = timeoutMs;currentTimeoutTimerId = client.getVertx().setTimer(timeoutMs, id -> handleTimeout(timeoutMs));return this;}
我们当调用这个方法时候,就已经开始进行超时计时(并不是从发出消息那刻算),并且继续深入源码会发现,该方法并无归还链接的操作。
即:一开始池中链接如果超时,并不会被主动释放(服务端调用closed时候,连接会被动释放),则后面依旧继续超时。
解决方案
在创建HttpClientOptions时候设置.setIdleTimeout(),源码中解释如下:
Set the idle timeout, default time unit is seconds. Zero means don't timeout.This determines if a connection will timeout and be closed if no data is received within the timeout.If you want change default time unit, use setIdleTimeoutUnit(TimeUnit)
即超时后会主动关闭连接
引用
https://github.com/eclipse-vertx/vert.x/issues/1842
Vertx中HttpClient的setTimeout坑相关推荐
- Javascript之旅——第四站:parseInt中要注意的坑
Javascript之旅--第四站:parseInt中要注意的坑 原文:Javascript之旅--第四站:parseInt中要注意的坑 前些天信用卡站点要接入一个新功能,不过还真比较坑爹,asp站点 ...
- python替代hadoop_Python连接Hadoop数据中遇到的各种坑(汇总)
最近准备使用Python+Hadoop+Pandas进行一些深度的分析与机器学习相关工作.(当然随着学习过程的进展,现在准备使用Python+Spark+Hadoop这样一套体系来搭建后续的工作环境) ...
- 10个问题让你快速避开java中的jdbc常见坑
摘要:JDBC,即Java Database Connectivity,java数据库连接.是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范. 本文分享自华为云社区<1 ...
- 小程序中曾经遇到的坑(1)----canvas画布
目前正在开发小程序,在开发过程中,总会遇到一些坑,而这些坑并不会有很多开发者遇到而说出来.这里先记录一条我开发过程中遇到的问题,以便后人在开发中能够更容易的解决问题!!! 首先,小程序在canvas画 ...
- 量化中需留意的坑之二
之前介绍过量化策略开发过程中容易菜的坑, 量化中需留意的坑之一:https://blog.csdn.net/u011331731/article/details/88351599 本文想补充的是另一个 ...
- [转载] python 列表List中index函数的坑
参考链接: Python列表list sort() python 列表List中index函数的坑 例如 a = [1, 2, 1] 如果使用 a.index(1), 输出的只是列表中第一个出现的 1 ...
- @Value注解使用过程中遇到的一些坑
笔者结合之前的一些经验教训,再结合一些资料总结了一下@Value注解使用过程中的一些注意事项. 目录 一.@Value无法读取配置文件中的参数 二.@Value出现中文乱码 三.@Value使用的一些 ...
- 关于项目部署在Tomcat中使用软连接之坑
关于项目部署在Tomcat中使用软连接之坑 需求背景 解决方式 注意事项 需求背景 有一个管理平台,平台需要进行上传音频文件,音频文件上传与下载都可以正常实现,但是出现一个这样的问题,如果H5页面获取 ...
- 机器学习中踩过的坑,如何让你变得更专业?
2020-05-24 23:42:23 编译 | 这只萌萌 编辑 | 丛 末 踩过坑才知道哪些路不可行,有时候犯错误也能帮助我们变得更加专业. 数据科学家Archy de Berker 在本文中详述了 ...
最新文章
- 史上世界上最惨烈的几次股灾!
- 【转载】CentsOS系统inotify实时监控服务器文件(夹)定制事件处理程序
- 聊聊flink的Async I/O
- Autodesk 360 Mobile不能显示图片?
- 基金投资需要注意什么?
- CF#303A Lucky Permutation Triple 数论
- c语言编写计算单词长度,编写一个程序,打印输入中单词长度的直方图
- linux打jar包命令行,windows下命令行打jar包方法
- 安卓游戏服务器修改,【httpcather/Thor】课程二,用抓包工具修改微信小游戏,还能保存到服务器...
- 鸟哥的linux的私房菜基础学习篇,鸟哥的Linux私房菜 基础学习篇-鸟哥.pdf
- Red Giant Universe 3.0.2 for After Effects 破解版 Mac 红巨星宇宙特效插件包预设
- 《语义网基础教程(原书第3版)》—— 导读
- BC1.2 PD协议
- 家用宽带如何叠加多条宽带,提高局域网速度
- Word中的SVG格式的矢量插图问题
- PyQt实现按钮控件的拖动效果,利用鼠标移动事件实现。
- conda:安装python
- chmod 命令详细用法
- 冲钱会员 php,php会员充值问题
- 【webpack】记录hmr失效解决方案