线上出现运行几个小时后,阿里云OSS无法进行操作问题,分析发现线程数线性增长,很快到达最大线程数,最后分析代码/查找OSS文档发现是使用OSSObject时没有close导致的,因为OSSObject封装了inputStream,未关闭会导致http连接一直处于open状态,无法进行回收,最后到达最大连接,彻底无法访问OSS。

随后对OSSClient代码进行分析,看下为何会线程线性增长;

1,查看OSSClient定义

public OSSClient(String endpoint, CredentialsProvider credsProvider, ClientConfiguration config) {this.credsProvider = credsProvider;config = config == null ? new ClientConfiguration() : config;if (config.isRequestTimeoutEnabled()) {this.serviceClient = new TimeoutServiceClient(config);} else {//新建DefaultServiceClient对象this.serviceClient = new DefaultServiceClient(config);}initOperations();setEndpoint(endpoint);}

2,查看DefaultServiceClient,定义了httpclient包里的PoolingHttpClientConnectionManager(http连接池管理器),并单独起线程进行连接回收策略

public DefaultServiceClient(ClientConfiguration config) {super(config);//使用了httpClient包里的连接管理器,重点看这里this.connectionManager = createHttpClientConnectionManager();this.httpClient = createHttpClient(this.connectionManager);RequestConfig.Builder requestConfigBuilder = RequestConfig.custom();//连接超时时间requestConfigBuilder.setConnectTimeout(config.getConnectionTimeout());requestConfigBuilder.setSocketTimeout(config.getSocketTimeout());requestConfigBuilder.setConnectionRequestTimeout(config.getConnectionRequestTimeout());//。。。。。省略代码this.requestConfig = requestConfigBuilder.build();}
protected HttpClientConnectionManager createHttpClientConnectionManager() {//。。。。省略代码Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create().register(Protocol.HTTP.toString(), PlainConnectionSocketFactory.getSocketFactory()).register(Protocol.HTTPS.toString(), sslSocketFactory).build();//使用httpclient的http连接池管理器PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);//设置最大连接,默认1024connectionManager.setDefaultMaxPerRoute(config.getMaxConnections());connectionManager.setMaxTotal(config.getMaxConnections());connectionManager.setValidateAfterInactivity(config.getValidateAfterInactivity());connectionManager.setDefaultSocketConfig(SocketConfig.custom().setSoTimeout(config.getSocketTimeout()).setTcpNoDelay(true).build());if (config.isUseReaper()) {//起新线程执行连接回收策略,重点关注IdleConnectionReaper.setIdleConnectionTime(config.getIdleConnectionTime());IdleConnectionReaper.registerConnectionManager(connectionManager);}return connectionManager;}

3,连接回收策略,定时去遍历连接管理器,然后调用httpclient的连接回收策略。

 public void run() {while (true) {if (shuttingDown) {getLog().debug("Shutting down reaper thread.");return;}//每次休眠五秒try {Thread.sleep(REAP_INTERVAL_MILLISECONDS);} catch (InterruptedException e) {}try {List<HttpClientConnectionManager> connectionManagers = null;synchronized (IdleConnectionReaper.class) {connectionManagers = (List<HttpClientConnectionManager>)IdleConnectionReaper.connectionManagers.clone();}//遍历所有连接管理器for (HttpClientConnectionManager connectionManager : connectionManagers) {try {//调用httpclient的回收连接方法,回收过期连接与超时空闲连接connectionManager.closeExpiredConnections();connectionManager.closeIdleConnections(idleConnectionTime, TimeUnit.MILLISECONDS);} catch (Exception ex) {getLog().warn("Unable to close idle connections", ex);}}} catch (Throwable t) {getLog().debug("Reaper thread: ",  t);}}}

4,总结,OSSClient实际是基于httpclient进行接口调用,并使用PoolingHttpClientConnectionManager进行连接管理,单独起线程进行连接的定时回收。

阿里云OSS线程增长问题分析相关推荐

  1. 使用阿里云OSS完成文件的上传样例

    使用阿里云OSS完成文件的上传 基础条件: 提前注册过阿里云账户 账户里有余额(文件上传按流量收费) 开通过OSS的基础服务 如果有以上基础条件不满足的小伙伴,去度娘了解一下. 前言 有过基础的小伙伴 ...

  2. 阿里云OSS视频文件迁移视频点播,并导出媒资excel表

    阿里云OSS视频文件迁移视频点播,并导出媒资excel表 一 介绍 1 OSS 是什么 2 视频点播是什么 3 制作背景 阿里云磁盘(读文件) 阿里云点播(写文件) 阿里云sdk导入依赖 二 流程 1 ...

  3. 整合百度UEditor上传图片到阿里云OSS

    前言 将图片上传到阿里云OSS是一种趋势,一个必然.当你的项目图片过多,需要频繁上传和替换的时候,用阿里云OSS可以很方便的管理你的图片,节省服务器空间,大大提高了效率.阿里云OSS是阿里云提供的海量 ...

  4. 已经有了阿里云OSS还需要开通CDN吗?

    单一的OSS模式,计费包括存储和外网流出费用,目前通常比较流行的方式是 OSS + CDN 的组合模式,OSS负责存储,CDN负责加速,那么只从流量费用的层面来说,采用 OSS + CDN 组合模式比 ...

  5. 文件分片上传阿里云OSS

    本文参考其他博客并结合自身编写 博客原作者:程序猿谢哥哥 博客原地址:https://blog.csdn.net/weixin_42825651/article/details/108792264 注 ...

  6. 阿里云OSS 图片处理

    首先放个阿里云OSS图片处理接口文档 阿里云官方地址 oss图片处理接口文档 我们有时会抱怨用户上传的图文中图片文件大了(假如说3M的图片).导致生成的网页打开速度慢,怎么办呢? 问题分析:网页打开慢 ...

  7. 阿里云Oss云存储的使用

    阿里云Oss云存储的使用 阿里云OSS云存储能够实现提供远程的文件上传服务器的功能,简化了文件上传功能.本文章简单描述在IDEAJava项目中通过API使用OSS创建Bucket功能. 一.开通OSS ...

  8. 【探花交友】阿里云OSS、百度人脸识别

    文章目录 1.完善用户信息 1.1.阿里云OSS 1.2.百度人脸识别 1.完善用户信息 用户在首次登录时需要完善个人信息,包括性别.昵称.生日.城市.头像等.其中,头像数据需要做图片上传,这里采用阿 ...

  9. 阿里云OSS 图片处理api(custom)

    首先放个阿里云OSS图片处理接口文档 阿里云官方地址 OSS 图片处理接口文档 我们有时会抱怨用户上传的图文中图片文件大了(假如说3M的图片).导致生成的网页打开速度慢,怎么办呢? 问题分析:网页打开 ...

  10. 阿里云oss 收费标准细则,太鸡贼了,不要傻傻的以为只收你存储的钱

    阿里云oss存储收费细则,如图 刚入坑,请详细分析你的流量需求,因为对一般网站或应用来说,最难控制的就是你的流量,同时记得图片 一定要防止被别的站盗链,不然流量费就搞死你了

最新文章

  1. pycharm 代码无法自动补全(自动顺带)的解决方法
  2. 网站优化助力网站在同行中更加出类拔萃
  3. (转载)Unity真机调试
  4. 工控机改装家庭智能中心--命令行配置无线wifi
  5. 使用 Node.js Express 的最佳实践
  6. could not perform addBatch
  7. 产品原型示例_原型设计模式示例
  8. 今天的西红柿就跑了的P8U8源码
  9. 树:二叉树的内存拷贝和内存释放
  10. 在VsCode里编写和运行不同语言的程序
  11. STC51-A/D和D/A
  12. 华为麦芒5云空间升级_云+AI+5G 华为云联手中软国际引爆线下门店智能化升级
  13. 如何printf64位整型! scanf sscanf
  14. Python3.6 用Django连接MySQL
  15. 价量分析.成交量判断多空头.用跌减涨增量法买股票.成交量识庄家
  16. 500个爆文标题_总结了500篇10W+爆文 好标题都离不开以下几点
  17. 易于设置的倒计时页面Easy countdown
  18. hihocoder01串
  19. 一个通过Rmd文件输出表格到word的简单方法
  20. 中国大学生计算机设计大赛二等奖

热门文章

  1. 美妆行业如何在小红书营销推广?美妆品牌的线上推广怎么宣传更有效果?
  2. Hadoop学习(二)---Secondary结点的配置以及HDFS的常用命令以及API的使用
  3. doPost 乱码问题解决
  4. LightOJ 1038
  5. java 获得文本框文本_Java获取和删除Word文本框中的表格
  6. Xcode(OC):control reaches end of non-void function
  7. SQLite在指定列后面插入字段_如何用SQL语句添加和修改字段?
  8. 中国将实施最严格机动车“全防全控”环境监管制度
  9. 【Openbravo开发】Openbravo windows开发环境搭建
  10. rabbitmq版本升级