多线程+连接池+代理 运行一段时间线程阻塞,如何解决??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

  多线程+连接池+代理 运行一段时间线程阻塞

  使用多线程+httpClient连接池+ip代理 请求第三方接口。运行一段时间 出现线程阻塞的情况。目前看线程阻塞都在一个调用的请求里面。

    @Retryable(value = {Exception.class}, // 指定哪些异常需要重试maxAttempts = 3,          // 重试次数backoff = @Backoff(delay = 3000) // 每次重试间隔2秒)@ApiLog(title = "XXXX",businessType = "拼接cookie请求第一部分",resultType = false)public String disneyByCookies01(String token) throws IOException {RequestConfig requestConfig = RequestConfig.custom()
//                .setSocketTimeout(10000)
//                .setConnectTimeout(10000).setRedirectsEnabled(false).build();HttpGet httpGet = new HttpGet("https://XXXXXXXX.cn/XXX/XXXXXX-svc-gw/api/auth_code/authorize/v1?activity_code=6119&redirect_type=0&redirect_uri=https://XXXX.activity-24.m.duiba.com.cn/customShare/share?id=Did1NTcxODM&");httpGet.setConfig(requestConfig);httpGet.setHeader("User-Agent", "Mozilla/5.0 (Linux; Android 10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/101.0.4951.74 Mobile Safari/537.36");httpGet.setHeader("Cookie", "piXX-m-sid=" + token + "; platform=8; app_version_code=282; app_version_name=5.1.9; app_device_type=android");httpGet.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");// 执行请求并获取响应HttpResponse response = httpClient.execute(httpGet);int statusCode = response.getStatusLine().getStatusCode();Header contentTypeHeader = response.getFirstHeader("Location");String location = contentTypeHeader.getValue();String accessCode = null;if (location != null) {String regex = "&access_code=([^&]*)";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(location);if (matcher.find()) {accessCode = matcher.group(1); // 提取匹配组中的access_code值log.info("【success】[线程:" + threadName + "]拼接cookie请求第一部分请求成功" + accessCode);}} else {log.info("【error】[线程:" + threadName + "]拼接cookie请求第一部分请求异常response中获取location失败" + response);throw new IllegalStateException("【error】[线程:" + threadName + "]拼接cookie请求第一部分请求异常response中获取location失败");}return accessCode;

友情提示:
  如上问题有的来自我自身项目开发,有的收集网站,有的来自读者…如有侵权,立马删除。再者,针对此专栏中部分问题及其问题的解答思路或步骤等,存在少部分搜集于全网社区及人工智能问答等渠道,若最后实在是没能帮助到你,还望见谅!并非所有的解答都能解决每个人的问题,在此希望屏幕前的你能够给予宝贵的理解,而不是立刻指责或者抱怨!如果你有更优解,那建议你出教程写方案,一同学习!共同进步。

解决方案

  如下是上述问题的解决方案,仅供参考:

  在使用多线程结合HttpClient连接池和IP代理请求第三方接口时,出现线程阻塞的情况可能由多种原因引起。以下是一些可能的原因和相应的解决方案:

1. 连接池配置不当

连接池可能没有正确配置,导致连接耗尽或重用不当。

  • 解决方案:检查连接池的配置,确保最大连接数和路由策略合理。

2. 请求超时

请求可能因为超时而阻塞。

  • 解决方案:在RequestConfig中设置合理的超时时间:
  RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(10000)  // 读取超时时间.setConnectTimeout(10000)  // 连接超时时间.setRedirectsEnabled(false).build();

3. 代理服务器问题

代理服务器可能不稳定或响应慢,导致请求阻塞。

  • 解决方案:监控代理服务器的性能,考虑更换代理或增加代理服务器。

4. 第三方接口限制

第三方接口可能对请求频率有限制,超出限制可能导致请求被拒绝或延迟。

  • 解决方案:检查第三方接口的使用限制,并相应调整请求频率。

5. 异常处理不当

异常处理可能导致线程无法正确释放资源。

  • 解决方案:确保异常被捕获并正确处理,避免线程因异常而阻塞。

6. 资源竞争

多线程环境下可能存在资源竞争,导致线程阻塞。

  • 解决方案:使用同步代码块或锁来管理资源访问,避免竞争条件。

7. 死锁

死锁可能导致线程阻塞。

  • 解决方案:检查代码中是否存在死锁情况,并优化锁的使用。

8. 日志记录

日志记录可能会影响性能,尤其是在高并发环境下。

  • 解决方案:优化日志记录策略,避免在关键路径上进行大量日志输出。

9. 重试机制

重试机制可能导致线程阻塞。

  • 解决方案:优化重试逻辑,避免在失败时立即重试,可以考虑引入随机退避策略。

10. HttpClient配置

HttpClient的配置可能影响性能。

  • 解决方案:检查HttpClient的配置,确保其适用于高并发场景。

示例代码优化

以下是一些优化后的示例代码:

@Retryable(value = {Exception.class},maxAttempts = 3,backoff = @Backoff(delay = 3000)
)
public String disneyByCookies01(String token) throws IOException {RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(10000).setConnectTimeout(10000).setRedirectsEnabled(false).build();HttpGet httpGet = new HttpGet("https://XXXXXXXX.cn/XXX/XXXXXX-svc-gw/api/auth_code/authorize/v1?activity_code=6119&redirect_type=0&redirect_uri=https://XXXX.activity-24.m.duiba.com.cn/customShare/share?id=Did1NTcxODM&");httpGet.setConfig(requestConfig);httpGet.setHeader("User-Agent", "Mozilla/5.0 (Linux; Android 10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/101.0.4951.74 Mobile Safari/537.36");httpGet.setHeader("Cookie", "piXX-m-sid=" + token + "; platform=8; app_version_code=282; app_version_name=5.1.9; app_device_type=android");httpGet.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");HttpResponse response = httpClient.execute(httpGet);int statusCode = response.getStatusLine().getStatusCode();Header contentTypeHeader = response.getFirstHeader("Location");String location = contentTypeHeader != null ? contentTypeHeader.getValue() : null;String accessCode = null;if (location != null) {String regex = "&access_code=([^&]*)";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(location);if (matcher.find()) {accessCode = matcher.group(1); // 提取匹配组中的access_code值log.info("【success】[线程:" + Thread.currentThread().getName() + "]拼接cookie请求第一部分请求成功" + accessCode);}} else {log.info("【error】[线程:" + Thread.currentThread().getName() + "]拼接cookie请求第一部分请求异常response中获取location失败" + response);throw new IllegalStateException("【error】[线程:" + Thread.currentThread().getName() + "]拼接cookie请求第一部分请求异常response中获取location失败");}return accessCode;
}

总结

线程阻塞可能是由多种因素引起的,需要综合考虑网络、资源、配置等多方面因素。通过优化代码和配置,可以提高系统的稳定性和性能。

  希望如上措施及解决方案能够帮到有需要的你。

  PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

  若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

☀️写在最后

  ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/413518.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<Rust>egui学习之小部件(四):如何在窗口中添加滚动条Scroll部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统:windows 平台:visual studio code 语言:rust 库:egui、eframe 概述 本文是本专栏的第四篇博…

今日算法:蓝桥杯基础题之“切面条”

你好同学,我是沐爸,欢迎点赞、收藏、评论和关注!个人知乎 从今天开始,一起了解算法,每日一题,从 JavScript 的技术角度进行解答,如果你对算法也感兴趣,请多多关注哦。 问题描述 一…

【深度学习与NLP】——深度卷积神经网络AlexNet

目录 一、卷积神经网络的发展历程 二、简要介绍 三、代码实现 四、缺点和过时的地方 一、卷积神经网络的发展历程 早期理论基础阶段(20 世纪 60 年代 - 80 年代): 1968 年,Hubel 和 Wiesel 通过对猫视觉神经的研究&#xff0…

Hibernate 批量插入速度慢的原因和解决方法

由于业务需要一次性连续写入超过10k条以上的新数据,当对象超过10个成员变量以后,整个写入过程居然需要长达35秒,这个速度是不能接受的,故此研究了一下怎么开启Hibernate批量写入的功能。 我这边使用的是Hibernate 5.6.15 在网上…

Python 从入门到实战3(列表的简单操作)

我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们通过python小栗子来学习python基础知识语法&#xff…

C语言中的“#”和“##”

目录 开头1.什么是#?2.什么是##?3.#和##的实际应用输出变量的名字把两个符号连接成一个符号输出根据变量的表达式…… 下一篇博客要说的东西 开头 大家好,我叫这是我58。在今天,我们要学一下关于C语言中的#和##的一些知识。 1.什么是#? #&#xff0…

《黑神话:悟空》:30%抽成真相

《黑神话:悟空》自建服务器出售?揭秘游戏界的30%抽成真相! 近年来,随着游戏行业的迅猛发展,游戏开发商与发行平台之间的利益分配问题逐渐成为业界关注的焦点。其中,《黑神话:悟空》作为一款备受…

JS基础之【基本数据类型与类型间的隐式显示转换】

🚀 个人简介:某大型国企高级前端开发工程师,7年研发经验,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码…

streamlit+wordcloud使用pyinstaller打包遇到的一些坑

说明 相比常规的python程序打包,streamlit应用打包需要额外加一层壳,常规app.py应用运行直接使用 python app.py就可以运行程序了,但streamlit应用是需要通过streamlit命令来运行 streamlit app.py所以使用常规的pyinstaller app.py打包是…

云同步的使用

云同步技术是一种在多个设备或系统之间保持数据一致性的技术,它通常依赖于云存储服务来实现。在Java中,实现云同步功能通常需要与云服务提供商的API进行交互,如Amazon S3、Google Cloud Storage、Microsoft Azure Blob Storage等。 以下是一个…

秋风送爽,夏意未央|VELO Prevail Revo坐垫,一骑绿动起来吧~

夏末秋初,当第一片落叶缓缓飘落,是时候骑上你的自行车,迎接新的季节啦。带上维乐Prevail Revo坐垫,因为它独树一帜地采用EVA与回收咖啡渣精制而成的轻量发泡提升了减震性能,可以让你的每一次骑行都充满意义。    “…

虚幻引擎(Unreal Engine)技术使得《黑神话悟空传》大火,现在重视C++的开始吃香了,JAVA,Go,Unity都不能和C++相媲美!

虚幻引擎(Unreal Engine)火了黑神话游戏。 往后,会有大批量的公司开始模仿这个赛道! C 的虚拟引擎技术通常指的是使用 C 语言开发的游戏引擎,如虚幻引擎(Unreal Engine)等。以下是对 C 虚拟引…

【virtuoso】INV 原理图+前仿真 + 版图 + 后仿真

采用SMIC工艺,不同工艺版图窗口可能有差异 1. 原理图&前仿真 1.1 绘制原理图 PMOS: NMOS宽长比2:1 PMOS开启导通电阻大一点,这样设置,可以使得阈值电压是VDD/2 按 i,可以插入器件按p,可以放置端口 1.2…

【机器学习】聚类算法的基本概念和实例代码以及局部度量学习的概念和实例代码

引言 聚类算法在许多领域都有广泛的应用,例如数据挖掘、生物信息学、图像处理等。 文章目录 引言一、聚类算法1.1 K-Means算法1.2 DBSCAN算法1.3 层次聚类(Hierarchical Clustering)算法1.4 高斯混合模型(Gaussian Mixture Model&…

Web自动化测试实战--博客系统

🎥 个人主页:Dikz12🔥个人专栏:测试📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 1.项目效果展示 2.编写web测试用例 3.自动化测试脚本开发 3.1创建空项目 引…

Web-gpt

AJAX AJAX(Asynchronous JavaScript and XML,异步JavaScript和XML)是一种用于创建动态网页应用的技术。它允许网页在不重新加载整个页面的情况下,异步地从服务器请求数据,并将这些数据更新到网页上。这提高了用户体验…

大语言模型-GLM-General Language Model Pretraining

一、背景信息: GLM是2020-2021年由智谱AI研究并发布的预训练语言模型。 GLM是一种基于自回归空白填充的通用预训练语言模型。 GLM 通过添加二维位置编码和允许任意顺序预测空白区域,改进了空白填充预训练,在NLU任务上超越了 BERT 和 T5。 GL…

12 对话模型微调2

1 P-Tuning P-Tuning 是在 Prompt-Tuning的基础上,通过新增 LSTM 或 MLP 编码模块来加速模型的收敛; 之前的实验也看到了使用prompt训练速度很慢,那么P-Tuning呢 参数占比: trainable params: 5,267,456 || all params: 1,308,37…

Llamaindex RAG实践

加入xtunert文档作为提示词 让大模型理解xtuner

Python 算法交易实验85 QTV200日常推进-钳制指标与交易量

说明 继续保持思考与尝试 最近挺有意思的,碰到很多技术上的问题,其解决方案都类似“阴阳两仪”的概念。 "阴阳两仪"是中国古代哲学中的一个重要概念,源自《易经》(又称《周易》)。它是对宇宙间最基本对立统一…