问题描述:

因为特殊原因,导致某一时间段的请求全部超时,当网络恢复正常后,后续的请求还是会继续超时,且服务端也不能再收到任务消息,只能重启客户端服务器。

代码贴示:

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坑相关推荐

  1. Javascript之旅——第四站:parseInt中要注意的坑

    Javascript之旅--第四站:parseInt中要注意的坑 原文:Javascript之旅--第四站:parseInt中要注意的坑 前些天信用卡站点要接入一个新功能,不过还真比较坑爹,asp站点 ...

  2. python替代hadoop_Python连接Hadoop数据中遇到的各种坑(汇总)

    最近准备使用Python+Hadoop+Pandas进行一些深度的分析与机器学习相关工作.(当然随着学习过程的进展,现在准备使用Python+Spark+Hadoop这样一套体系来搭建后续的工作环境) ...

  3. 10个问题让你快速避开java中的jdbc常见坑

    摘要:JDBC,即Java Database Connectivity,java数据库连接.是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范. 本文分享自华为云社区<1 ...

  4. 小程序中曾经遇到的坑(1)----canvas画布

    目前正在开发小程序,在开发过程中,总会遇到一些坑,而这些坑并不会有很多开发者遇到而说出来.这里先记录一条我开发过程中遇到的问题,以便后人在开发中能够更容易的解决问题!!! 首先,小程序在canvas画 ...

  5. 量化中需留意的坑之二

    之前介绍过量化策略开发过程中容易菜的坑, 量化中需留意的坑之一:https://blog.csdn.net/u011331731/article/details/88351599 本文想补充的是另一个 ...

  6. [转载] python 列表List中index函数的坑

    参考链接: Python列表list sort() python 列表List中index函数的坑 例如 a = [1, 2, 1] 如果使用 a.index(1), 输出的只是列表中第一个出现的 1 ...

  7. @Value注解使用过程中遇到的一些坑

    笔者结合之前的一些经验教训,再结合一些资料总结了一下@Value注解使用过程中的一些注意事项. 目录 一.@Value无法读取配置文件中的参数 二.@Value出现中文乱码 三.@Value使用的一些 ...

  8. 关于项目部署在Tomcat中使用软连接之坑

    关于项目部署在Tomcat中使用软连接之坑 需求背景 解决方式 注意事项 需求背景 有一个管理平台,平台需要进行上传音频文件,音频文件上传与下载都可以正常实现,但是出现一个这样的问题,如果H5页面获取 ...

  9. 机器学习中踩过的坑,如何让你变得更专业?

    2020-05-24 23:42:23 编译 | 这只萌萌 编辑 | 丛 末 踩过坑才知道哪些路不可行,有时候犯错误也能帮助我们变得更加专业. 数据科学家Archy de Berker 在本文中详述了 ...

最新文章

  1. 史上世界上最惨烈的几次股灾!
  2. 【转载】CentsOS系统inotify实时监控服务器文件(夹)定制事件处理程序
  3. 聊聊flink的Async I/O
  4. Autodesk 360 Mobile不能显示图片?
  5. 基金投资需要注意什么?
  6. CF#303A Lucky Permutation Triple 数论
  7. c语言编写计算单词长度,编写一个程序,打印输入中单词长度的直方图
  8. linux打jar包命令行,windows下命令行打jar包方法
  9. 安卓游戏服务器修改,【httpcather/Thor】课程二,用抓包工具修改微信小游戏,还能保存到服务器...
  10. 鸟哥的linux的私房菜基础学习篇,鸟哥的Linux私房菜 基础学习篇-鸟哥.pdf
  11. Red Giant Universe 3.0.2 for After Effects 破解版 Mac 红巨星宇宙特效插件包预设
  12. 《语义网基础教程(原书第3版)》—— 导读
  13. BC1.2 PD协议
  14. 家用宽带如何叠加多条宽带,提高局域网速度
  15. Word中的SVG格式的矢量插图问题
  16. PyQt实现按钮控件的拖动效果,利用鼠标移动事件实现。
  17. conda:安装python
  18. chmod 命令详细用法
  19. 冲钱会员 php,php会员充值问题
  20. 【webpack】记录hmr失效解决方案

热门文章

  1. 阿里巴巴的8个“孩子”都用了什么域名?
  2. 数据中心何时能摆脱夜夜割,蓝瘦香菇
  3. mouseover和mouseenter、mouseout和mouseleave
  4. Python 中导入模块
  5. 重定向fputc函数实现printf串口发送
  6. 正则化的作用以及L1和L2正则化的区别
  7. this、super的用法
  8. 支付宝wap支付详情
  9. git branch分支切换和合并
  10. c shell 学习记录(csh)