httpclient大量请求网络拒绝 Connection pool shut down

1.背景描述

项目中每次400条数据递归网络请求第三方数据,该次递归总的数据量有220000左右,可以算出大概需要550次调用。但是数据跑到13W左右,程序中断。

2.案例分析

①.系统跑了一遍,没有看到任何日志。

分析: 因为是多线程应用,一开始以为是线程池写法有误,导致数据库连接用完,

解决:使用自定义连接池上了一版,并且加上了日志。

②.系统再跑了一遍,发现日志报错

 

 

分析:问题基本上可以定位到时httpclent问题了。

HttpClientBuilder builder = HttpClients.custom();

使用该方式定义了httpcliet,默认使用的是PoolingHttpClientConnectionManager 线程池管理器

默认每个route只允许最多2个connection,总的connection数量不超过20。

 

但是如果请求多了,还是会出现线程不够用的情况。

解决:

第一种方案:

setConnectionManagerShared(true) 如果线程来不及处理,卡在那里复用线程池。

第二种方案:

setMaxTotal(1000); // 连接池最大并发连接数

setDefaultMaxPerRoute(1000);// 设置最大并发数

③.系统又跑了一遍,发现栈溢出

 

 

分析:syncECCustomerByStepPage 方法栈溢出。

解决:

第一种方案:使用Xss设置栈的大小,弊端是需要知道栈有多大才好设置,而且开发环境和测试环境系统资源比较小,可能一下无法满足需求。

第二种方案:重写代码,使用循环代替递归。

 

参考文档:

https://blog.csdn.net/iq105/article/details/75355831

https://www.jianshu.com/p/14c005e9287c

 

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值