使用异步HttpClient时线程hang住

Java HttpClient资源管理:CloseableHttpClient连接池与超时重试实战 HTTP客户端是Java应用网络通信的基础组件,其核心在于连接生命周期管理。CloseableHttpClient作为Apache HttpClient 4.x中实现AutoCloseable的关键实现类,通过PoolingHttpClientConnectionManager提供可配置的连接复用能力,结合RequestConfig实现连接、读取与请求获取三重超时控制,并支持自定义HttpRequestRetryHandler应对瞬时网络故障。这些机制共同保障了高并发、弱网络环境下的服务稳定性与资源可控性, 阅读详情

某次处理问题,发现线上的某个线程池全部hang住,jstack发现堆栈如下

"pool-3-thread-50" #70 prio=5 os_prio=0 tid=0x00007fa451317800 nid=0x5f23 in Object.wait() [0x00007fa44e6e5000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:502)
        at org.apache.http.concurrent.BasicFuture.get(BasicFuture.java:82)
        - locked <0x000000064203a720> (a org.apache.http.concurrent.BasicFuture)
以下省略

可以看到全部挂在httpClient等待响应完成时,排查代码时,发现我们所有的HttpClient都设置了超时时间(包括connectionTimeout/soTimeout)觉得不会发生这种错误;于是决定写代码模拟一下,发现在网络不可达的情况下很容易能复现这个问题,线程10分钟了依然在get这卡住;问题修复比较简单,org.apache.http.concurrent.BasicFuture<T>有带超时参数的get方法,替换即可修复。

https://stackoverflow.com/questions/14700315/apache-httpasyncclient-hangs-under-load 也碰到类似的情况。

学习到的就是,做网络编程时,经常会把关注点放在连接属性的设置上,之前看各种超时都设置了,觉得应该没问题了,但是HttpClient本身的bug,导致异常情况下不会回调到org.apache.http.concurrent.BasicFuture.failed(Exception)或者org.apache.http.concurrent.BasicFuture.completed(T)方法,就会导致get()一直卡这导致线程挂死

Task不是语法糖:.NET异步编程的状态机与调度本质 Task是.NET中表示异步操作的核心抽象,本质上是一个融合状态机、调度策略与上下文管理的承诺(Promise)对象,而非线程封装或简单‘后台任务’。其运行原理依赖编译器生成的状态机、SynchronizationContext上下文捕获机制以及IOCP/ThreadPool协同调度,决定了await行为、死锁风险与性能特征。理解Task有助于规避UI线程阻塞、线程池饥饿、取消失效等高频生产问题,并支撑高可靠I/O密集型服务构建。本文深入Task底层机制,结合ConfigureAwait、Cancellat 阅读详情

相关推荐

Triton推理服务生产实践:GPU模型部署与高可用架构

机器学习模型部署不是简单启动一个Web服务,而是构建具备进程韧性、资源隔离、可观测性和水平扩展能力的生产级推理系统。核心挑战在于如何让模型在真实流量下稳定低延迟运行,尤其在GPU加速场景中,瓶颈常出现在数据预处理、显存调度与动态批处理协同环节。NVIDIA Triton Inference Server凭借原生支持多框架、动态批处理、模型热更新和GPU精细化管控,成为高并发、低延迟、可运维AI服务的关键基础设施。本文围绕Triton展开实战解析,涵盖模型仓库规范配置、客户端SDK封装、Kubernetes

weixin_30301449的博客 583

Apache的HttpAsyncClient源码浅谈

/** * 此接口只代表HTTP请求执行的最基本的契约。它对请求执行过程不施 * 加任何限制或特定细节,并将状态管理、身份验证和重定向处理的细节 * 留给子类实现。 */ public interface HttpAsyncClient { /** * 使用给定上下文启动异步HTTP请求execution。 */ <T> Future<T> execute( HttpAsyncRequestProduc...

stay hungry ! stay foolish! 3283

GPS从入门到放弃(一) --- GPS基础原理

GPS从入门到放弃(一) — GPS基础原理 GPS,全称Global Positioning System,已经广泛应用于我们的日常生活中了,现在的智能手机 里都会自带GPS定位功能。这是一个美国的全球定位系统,虽然我们现在也有北斗了,但毕竟GPS搞的早,所以先从它开始研究起。 整个GPS系统分三大部分: 地面站 卫星 接收机 地面站负责监控。它们通过接收、测量各个卫星信号,计算卫星的运行轨...

tyst08的专栏 2万+

[阅读] 三个实例演示 Java Thread Dump 日志分析

原文 线程状态 死锁, DeadLock, 多个线程调用间, 进入相互资源占用, 导致一直等待无法释放的情况; 执行中, Runnable, 指该线程正在执行状态中, 该线程占用了资源, 正在处理某个请求, 或者正在传递 SQL 到数据库执行, 或对某个文件操作, 或进行数据类型转换等; 等待资源, Waiting on condition, 等待资源, 或等待某个条件的发生;(结合 stacktrace 分析) 如果栈信息明确是应用代码, 则证明该线程正在等待资源, 一般是大量读取某资源, 且该资源采

记忆碎片 510

Arduino-Pico:用Arduino生态开发树莓派RP2040双核与PIO实战

在嵌入式开发领域,微控制器编程是连接硬件与软件的核心技能。其原理在于通过编写代码直接控制处理器与外设,实现特定功能。掌握这项技术能极大提升开发效率,降低硬件操作门槛,广泛应用于物联网、智能硬件和自动化控制等场景。本文聚焦于如何利用Arduino这一广受欢迎的生态,来开发树莓派RP2040微控制器。RP2040以其双核Cortex-M0+架构和独特的可编程IO(PIO)硬件而著称,性能强大。通过第三方Arduino核心(arduino-pico),开发者可以沿用熟悉的Arduino语法和库,快速调用双核并行处

weixin_26905423的博客 381

细说VLAN之untag和tag

一、拓扑图 先给出上面拓扑图的结论,后面再详细讲解: 结论:只有PC1与PC4之间能相互通信,除此之外,所有PC之间均不能通信,比如PC1与PC3不能建立通信。 针对Ping命令的一个知识: 要想ping通某台主机,必须满足两个条件: 1,源主机的ICMP请求包必须能达到目的主机。 2,目的主机的ICMP应答包必须能回到源主机。 二、理论基础 端口的出...

NoobMaster的博客 3万+

java并发编程之Future.get() 一直阻塞

担心调用量太多,允许丢弃部分结果,并行允许,定义线程池。自定义RejectedExecutionHandler,取消执行( ((FutureTask) r).cancel(true)),这样应该是最合适的。web调用时Executor.submit(),如果设置AbortPolicy时没有返回结果,只会抛出异常。转载自:https://blog.youkuaiyun.com/doctor_who2004/article/details/115647638。

qingfeng2556的博客 768

避开这些坑!医疗影像数据增强的6个安全操作指南(附PyTorch代码)

本文详细介绍了医疗影像数据增强的六大安全准则,包括解剖结构守恒、密度值物理意义保留和病灶特征保护等关键原则,并提供了PyTorch实战代码。通过具体案例和参数建议,帮助开发者在肺结节检测和MRI分割等医疗AI应用中实现安全有效的数据增强,避免因不当操作导致的诊断误差。

cola5的博客 553

Httpclient 卡死在 httpClient.execute()

     记录一次使用Httpclient卡死在 java.net.SocketInputStream.socketRead0(Native Method)解决的过程      以前都用c#写爬虫,未曾出现过问题,前段时间采用java编写爬虫,使用的为Apache的HttpClient进行http请求,总共编写了6个抓取程序,其中五个都没出现问题,但是一个网站从HTTP升级到HTTPS之后(线程...

s906199800的博客 1万+

图相似度模型(论文篇)

图相似度模型

weixin_43702653的博客 5746

【DRAM存储器五十五】LPDDR5介绍--command bus training

本文详细介绍了LPDDR5命令总线训练(CBT)的两种模式操作流程。在启用ODT进行高频/中频操作前,必须对命令总线进行训练,包括调整VREF(CA)电压和CA/CS信号时序。两种模式的主要区别在于VREF(CA)设置方式:模式1通过MR12直接设置,模式2通过DMI[0]引脚捕获DQ[6:0]数据更新MR12。训练流程涉及频率切换、模式寄存器配置、pattern发送及结果采样等步骤,最终确定最佳VREF(CA)和时序参数。文章还分析了不同PHY实现可能存在的差异,如训练pattern生成方式和采样次数等。

highman110的博客 648

Flink写入Elasticsearch(es)问题汇总记录

Flink写入Elasticsearch问题汇总 1、报错信息: org.apache.flink.client.program.ProgramInvocationException: The main method caused an error: mapping source must be pairs of fieldnames and properties definition. at org.apache.flink.client.program.PackagedProgram.callMain

qq_38558851的博客 4010

为什么devc++编译项目会失败?提示gcc无法正常启动...

根据你的描述,编译能正常进行时,只打开源文件并没有问题,问题主要出现在创建项目后编译失败,这通常与 Makefile 配置、环境变量、编译器路径设置等因素有关。你可以检查 Makefile 配置,验证 DevC++ 的编译器环境设置,或者尝试清理并重新配置项目。如果问题仍然存在,可以尝试重装 DevC++ 或重新配置工具链。希望如上措施及解决方案能够帮到有需要的你。

**My Coding Family** 1375

java实现线程异步调用,java异步线程,java异步调用线程池中的线程

java异步线程,java异步调用线程池中的线程,Java实现异步调用二、Futurejdk8之前的实现方式,在JUC下增加了Future,从字面意思理解就是未来的意思,但使用起来却着实有点鸡肋,并不能实现真正意义上的异步,获取结果时需要阻塞线程,或者不断轮询。@Testpublic void test1() throws Exception {System.out.println( main函数...

weixin_39837105的博客 722

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java异步非阻塞编程的几种方式

凌云时刻 · 技术导读:Java异步非阻塞编程的几种方式作者|尘定来源|阿里技术从一个同步的Http调用说起一个很简单的业务逻辑,其他后端服务提供了一个接口,我们需要通过接口调用,获取到响...

云布道师 633

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

java http异步调用_HttpClient的异步调用,你造吗?

一、前言HttpClient提供了两种I/O模型:经典的java阻塞I/O模型和基于Java NIO的异步非阻塞事件驱动I/O模型。Java中的阻塞I/O是一种高效、便捷的I/O模型,非常适合并发连接数量相对适中的高性能应用程序。只要并发连接的数量在1000个以下并且连接大多忙于传输数据,阻塞I/O模型就可以提供最佳的数据吞吐量性能。然而,对于连接大部分时间保持空闲的应用程序,上下文切换的开销可能...

weixin_35599225的博客 2846

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java调用一个方法后怎么继续执行不等待该方法的返回_深入分析Java并发工具类CountDownLatch...

1.什么是CountDownLatch顾名思义,CountDownLatch是一个倒计时器。适用于多线程中,一个线程需要等待其他线程到达指定状态后再继续执行。举个场景例子,火箭发射。需要3个步骤1.设定倒计时的时间2.等待倒计时完成3.发射我们用代码来实现一下这个功能执行结果2.CountDownLatch的使用方法就如同举的场景示例一样,CountDownLatch的使用方式也是分3个步骤1.实...

weixin_39682301的博客 678

linux apache配置多线程,Linux下Apache服务器并发优化

Linux/UnixLinux系统下Apache 并发数的优化Apache Http服务器采用prefork或者是worker两种并发控制模式。preforkMPM使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台 上,PreforkMPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有...

weixin_36325879的博客 553

java实现异步非阻塞的几种方式-同步阻塞调用

java实现异步非阻塞的几种方式-1 1. 同步阻塞调用 在讲异步非阻塞之前还是先来说明同步阻塞的调用吧。明白了同步阻塞的调用,才能更好的明白异步非阻塞的调用。以一个示例来说明吧,这是一个非常常见的程序间的调用。 我们的程序对外提供当前的用户的订单详细查询的接口,订单接口先调用用户服务,获取当前的用户信息;再调用商品接口获取商品的详细信息。 就以这样一个示例程序来说明吧。 假设这个订单服务调用用户服务的时间是2秒,调用商品服务的时间是3秒,订单服务自身的处理时间是1秒,那整个处理流程所需的时间就是2+3+

bug_null的博客 746

java httpclient 异步请求_Java利用httpasyncclient进行异步HTTP请求

Java利用httpasyncclient进行异步HTTP请求前段时间有个需求在springmvc mapping的url跳转前完成一个统计的业务。显然需要进行异步的处理,不然出错或者异常会影响到后面的网页跳转。异步的方式也就是非阻塞式的,当异步调用成功与否程序会接着往下执行,不必等到输入输出处理完毕才返回。主要用到httpasyncclient-4.0.1.jar,httpclient-4.3....

weixin_39721853的博客 758

记一次线程挂死的排查过程(附 HttpClient 配置建议)

1、事发 我们有个视频处理程序,基于 SpringBoot,会启动几个线程来跑。要退出程序时,会发送一个信号给程序,每个线程收到信号后会平滑退出,等全部线程都退出后,整个进程再平滑退出。 整个程序平时运行都正常,然后有一天,我们发送了退出信号给程序后,发现程序无法自动退出了!肿么回事呢,grep 一下日志看到是这样的。 # grep 'receive exit signal' /PATH/TO/LOG [2019-02-22 09:49:28,884][INFO ][Thread-75][n.p.

895

线程池引发的故障到底该怎么排查?

点击上方“后端技术精选”,选择“置顶公众号”技术文章第一时间送达!作者:sunshujie1990www.jianshu.com/p/d85cd6d60a6e技术经验交流...

Java笔记虾 5410

BUG记录 —— Java 使用HTTPClient出现死锁

这两天碰到一个奇怪的问题,Java在使用HTTPClient的时候,多调用了几次,然后就出现死锁,程序停到client.execute(httpget); 不往下走,也不抛异常。堆栈信息报错如下: java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) ...

u011909918的博客 2232

java 内存索引_java - 在一个请求中创建索引,别名并配置过渡[Elasticsearch Java API] - 堆栈内存溢出...

这是我编写的用于在作业启动时准备过渡索引的代码的片段:// Prepare indicesprivate void indexInit() throws RuntimeException {RestHighLevelClient client = new RestHighLevelClient(this.restClientBuilder);GetAliasesRequest requestWit...

weixin_39747975的博客 400

elasticsearch之记录es7.17升级8.17 springboot2.7.0 程序改造坑

elasticsearch之记录es7.17升级8.17 springboot2.7.0 程序改造坑

nalanxiaoxiao2011的博客 1639
上一篇: 一次kafka堆积问题解决
下一篇: png图片压缩后黑底问题解决
coder_xia
博客等级 码龄17年 151粉丝 143原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值