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

news2024/9/19 20:41:12

🏆本文收录于《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.coloradmin.cn/o/2093167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CSP:202012-2】期末预测之最佳阈值(Java)

题目链接 202012-2 期末预测之最佳阈值 题目描述 求解思路 前缀和 根据题意我们可以得知: θ θ θ 值为 a[i].y 时的预测正确的次数等于 a[i].y 前面有多少个 result 0 以及后面有多少个result 1。定义Score类用来存储y和result,其中sum0表示a[1]…

苹果macOS 15.1 Beta 3发布 允许用户将App Store应用下载到外置硬盘

8 月 29 日消息,苹果今日向 Mac 电脑用户推送了 macOS 15.1 开发者预览版 Beta 3 更新(内部版本号:24B5035e),本次更新距离上次发布 Beta / RC 间隔 16 天。 苹果公司在发布 iOS / iPadOS 18.1 Beta 3 更新之外&#x…

redis的共享session应用

项目背景: 该项目背景就是黑马的黑马点评项目。 一:基于Session实现验证码登录流程 基本的登录流程我们做了很多了。这个是短信登录流程 其实和普通的登录流程就多了一个生成验证码,并将验证码保存在session中,并且呢&#xf…

20240831 每日AI必读资讯

Runway 突然删除清空了 HuggingFace 上的所有内容!原因不明... - 之前的项目也无法访问了,比如 Stable Diffusion v1.5也被删了 🔗https://huggingface.co/runwayml/stable-diffusion-v1-5 🔗GitHub 也空了:https:…

ue Rotate to face BB entry转向不对

可能原因: 角色模型没有到正向。 错误: 正确:

C语言:ASCII码表和字符操作

目录 目录 1. 引言 2. ASCII码表 2.1 控制字符 2.2 可显示字符 3. 例子 3.1 相关函数 3.2 打印能够显示的 ASCII码 3.3 字母大小写转换 3.4 数字转数字字符 1. 引言 因为计算机只是认识 0 和 1组成的一串串的二进制数字,为了将人类认识的文…

【时间盒子】-【1.序言】高效人士都在用的时间管理方法。我是如何通过鸿蒙元服务APP实现?

一、介绍 【时间盒子】系列内容将帮助开发者学习如何构建一个全新的HarmonyOS元服务应用,学习使用DevEco Studio创建新项目、使用预览器预览页面、使用真机调试APP、自定义弹窗、使用系统提醒能力(闹钟)、使用首选项数据持久化、熟悉ArkUI页…

Centos 下载和 VM 虚拟机安装

1. Centos 下载 阿里云下载地址 centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 2. VM 中创建 Centos 虚拟机 2.1 先打开 VM 虚拟机,点击首页的创建新的虚拟机 2.2 选择自定义,然后点击下一步。 2.3 这里默认就好,继续选择下一…

PE文件结构详解(非常详细)

最近在参考OpenShell为任务栏设置图片背景时,发现里面使用了IAT Hook,这一块没有接触过,去查资料的时候发现IAT Hook需要对PE文件结构有一定的了解,索性将PE文件结构的资料找出来,系统学习一下。 PE文件结构 Portable…

C++基础(1)——入门知识

目录 1.C版本更新 2.C参考⽂档: 3.C书籍推荐 4.C的第⼀个程序 5.命名空间 5.1namespace的价值 5.2namespace的定义 5.3 命名空间使⽤ 6.C输⼊&输出 7.缺省参数 8.函数重载 9.引⽤ 9.1引⽤的概念和定义 9.2引⽤的特性 9.3引⽤的使用 9.4const引⽤…

YOLOv5独家改进:一种高效移动应用的卷积加性自注意Vision Transformer

💡💡💡本文独家改进:高效移动应用的卷积加性自注意Vision Transformer,构建了一个新颖且高效实现方式——卷积加性相似度函数,并提出了一种名为卷积加性标记混合器(CATM) 的简化方法来降低计算开销 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/cat…

opencv/c++的一些简单的操作(入门)

目录 读取图片 读取视频 读取摄像头 图像处理 腐蚀 膨胀 调整图像大小 裁剪和缩放 绘制 绘制矩形 绘制圆形 绘制线条 透视变换 颜色检测 轮廓查找 人脸检测 检测人脸 检测嘴巴 可适当调整参数 读取图片 读取路径widows使用vis sto一定是\斜杠 #include <o…

LoRA 和 DoRA 代码笔记

Improving LoRA: Implementing Weight-Decomposed Low-Rank Adaptation (DoRA) from Scratch LoRA LoRA初始化时&#xff0c;A使用正态分布&#xff0c;B使用0. class LoRALayer(nn.Module):def __init__(self, in_dim, out_dim, rank, alpha):super().__init__()std_dev 1…

第L1周:机器学习-数据预处理

第L1周&#xff1a;机器学习-数据预处理 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 学习要点&#xff1a; **** 学习如何处理缺损数据尝试进行Label编码使用train_test_split进行数据划分学习特征标准化…

EXO项目StandardNode;max_generate_tokens;buffered_token_output;is_finished;

目录 StandardNode max_generate_tokens buffered_token_output 构造函数参数 类属性 总结 is_finished max_generate_tokens self.buffered_token_output StandardNode _process_tensor result是一个np.ndarray ,result.size == 1是什么意思 StandardNode max_g…

【Python机器学习】NLP词频背后的含义——反馈及改进

之前学习的LSA方法都没有考虑文档之间的相似度信息&#xff0c;创建的主题对一组通用规则来说是最优的。在这些特征&#xff08;主题&#xff09;提取模型的无监督学习中&#xff0c;没有任何关于主题向量之间应该多么接近的数据。我们也不允许任何关于主题向量在哪里结束或者它…

力扣刷题(复习版1)

文章目录 题目&#xff1a;最大重复子字符串题解 题目&#xff1a; 面试题 16.07. 最大数值题解 题目&#xff1a; 最大字符串配对数目题解 题目&#xff1a; 字符串中第二大的数字题解 题目&#xff1a; 统计最大组的数目题解 题目&#xff1a; 删除每行中的最大值题解 题目&a…

记录|Chart控件使用

目录 前言一、Series集合1.1 什么是Series1.2 IsValueShownAsLabel1.3 Points 二、ChartArea2.1 轴- Axes2.1.1 Title2.1.2 刻度下的Maximum、Minimum2.1.3 间隔- Interval2.1.4 网格刻度线 2.2 游标- CursorX/CursorYMajorGrid属性中的Enabled 更新时间 前言 参考视频&#xf…

七、库存管理——盘点业务

第一节 库存管理盘点 1、盘点的目的 答&#xff1a;是指通过定期或临时对库存商品的实际数量进行盘查、清点&#xff0c;然后掌握货物的流动情况&#xff08;入库、出库、调拨、在库等&#xff09;&#xff0c;最后对仓库现有物品的实际数量与保管账上记录的数量相核对&…

Spring Boot集成Stripe快速入门demo

1.什么是Stripe&#xff1f; 一体化全球支付平台&#xff0c;开启收入增长引擎&#xff0c;针对不同规模业务打造的支付解决方案&#xff0c;满足从初创公司到跨国企业的多维度需求&#xff0c;助力全球范围内线上线下付款。 转化更多客户: 通过内置的优化功能、100 多种支付…