之前在每个控制层OSSClient都是通过新new的方式创建OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret)进行创建

后期我想应该可以把这个进行单例化

改了一番,单例化是实现了,可以每次调用一个方法时,只有首次会获取成功,第二次虽然连接会是true,但是会显示ossClient实例为null,从而无法继续调用

第一次执行获取bucket的name集合

  1. {
  2. "success": true,
  3. "bucketsNames": [
  4. "beijing-oss-1",
  5. "huhehaote-oss-1",
  6. "qingdao-oss-1",
  7. "sugar-oss1",
  8. "test-oss-create",
  9. "test-oss-create1",
  10. "ukyomooc123osstestdemo"
  11. ]
  12. }

第二次执行

  1. {
  2. "success": true,
  3. "bucketsNames": null
  4. }

错误信息

  1. 2019-12-23 10:03:46.053 WARN 1476 --- [nio-8011-exec-3] com.aliyun.oss : [Unknown]Unable to execute HTTP request: Connection pool shut down
  2. com.aliyun.oss.ClientException: 网络连接错误,详细信息:Connection pool shut down
  3. [ErrorCode]: Unknown
  4. [RequestId]: Unknown
  1. Caused by: java.lang.IllegalStateException: Connection pool shut down

这是因为在每个服务调用后都按照官方demo进行了shutdown

  1. } finally {
  2. if(null != ossClient){
  3. ossClient.shutdown();
  4. }
  5. }

 

而我又查了下aliyun开发问题也有相同的问题https://developer.aliyun.com/ask

只不过都是挺久之前的了.

  1. 如果完成操作之后使用shutdown方法, 会抛出线程异常, 如果对OSSClient不做任何处理, 每隔60秒就有关闭空闲连接的日志输出(new2OSSClient实例, 完成操作之后断点停住):

  1.     从第二张图,排行前35中,基本都是基础类型和javaapachesun的包,只有一个是aliyun的类,而且这个配置类,看第二列,实例数(instances),理论上不可能会达到1W8的客户端同时在连接,再看那些HttpClientBuilderSocksSocketImpl这些都是与网络请求有关的,OSS的上传也是需要这些,而且数量上,都是在1W8左右
  2.  
  3.      后面去看过代码,每次上传文件到OSS,服务端都是采用先获取授权令牌,然后new OSSClient()去开启一个上传客户端连接,但是后面没有关闭,初步断定是这个地方的问题,随即增加了 ossClient.shutdown();
  1. 问题已经解决了,内存也不需要那么大,最后要提醒下大家,用完一定要关闭,很重要!!!
  2.  
  3. ossClient.shutdown();

https://developer.aliyun.com/ask/243394?spm=a2c6h.13524658 OSSClient 每次使用都new 还是 使用单例好,必须shutdown 吗?

您的工程中可以有一个或多个OSSClient。OSSClient可以并发使用。

所以最终以取消掉shutdown()操作为最后操作

单例化ossclient工厂

  1. package com.springboot.oss.entity;
  2.  
  3. import com.aliyun.oss.OSS;
  4. import com.aliyun.oss.OSSClientBuilder;
  5. import org.springframework.beans.factory.annotation.Value;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.PropertySource;
  8. import org.springframework.context.annotation.Scope;
  9. import org.springframework.stereotype.Component;
  10.  
  11. /**
  12. * OSSClient单例化工厂
  13. * 使用ossClient单例化后,不可以再进行shutdown操作
  14. */
  15. @PropertySource(value = "classpath:aliyunConfig.properties")
  16. @Component
  17. public class OssClientFactory {
  18. //volatile是Java提供的一种轻量级的同步机制,在并发编程中,也扮演着比较重要的角色.
  19. //同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用
  20. //synchronized所带来的庞大开销,倘若能恰当的合理的使用volatile,则wonderful
  21. private volatile static OSS client;
  22.  
  23. private OssClientFactory(){}
  24.  
  25. private volatile static OSSClientBuilder ossClientBuilder;
  26.  
  27. private static String endpoint;
  28.  
  29. private static String accessKeyId;
  30.  
  31. private static String accessKeySecret;
  32.  
  33. @Value("${aliyun.endpoint}")
  34. public void setEndpoint(String endpoint) {
  35. this.endpoint = endpoint;
  36. }
  37. @Value("${aliyun.accessKey.Id}")
  38. public void setAccessKeyId(String accessKeyId) {
  39. this.accessKeyId = accessKeyId;
  40. }
  41. @Value("${aliyun.accessKey.Secret}")
  42. public void setAccessKeySecret(String accessKeySecret) {
  43. this.accessKeySecret = accessKeySecret;
  44. }
  45.  
  46. @Bean
  47. @Scope("prototype")
  48. public static OSS getOSSClient(){
  49. if(client == null){
  50. synchronized(OssClientFactory.class){
  51. if(client==null){
  52. client = getOSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);
  53. }
  54. }
  55. }
  56. return client;
  57.  
  58. // client = getOSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  59. // return client;
  60. }
  61.  
  62. public static OSSClientBuilder getOSSClientBuilder(){
  63. System.out.println("获取OSSClientBuilder");
  64. if(ossClientBuilder == null){
  65. System.out.println("OSSClientBuilder为空,创建中");
  66. synchronized(OssClientFactory.class){
  67. if(ossClientBuilder==null){
  68. System.out.println("进入同步实例化OSSClientBuilder");
  69. ossClientBuilder = new OSSClientBuilder();
  70. }
  71. }
  72. }
  73. return ossClientBuilder;
  74. }
  75.  
  76. }

获取OSSClientBuilder
OSSClientBuilder为空,创建中
进入同步实例化OSSClientBuilder
list buckets : [OSSBucket [name=beijing-oss-1, creationDate=Fri Dec 20 11:19:37 CST 2019, owner=Owner [name=1932998108284896,id=1932998108284896], location=oss-cn-beijing, ...
获取OSSClientBuilder
list buckets : [OSSBucket [name=beijing-oss-1, creationDate=Fri Dec 20 11:19:37 CST 2019, owner=Owner [name=1932998108284896,id=1932998108284896], location=oss-cn-beijing, ...

您的工程中可以有一个或多个OSSClient。OSSClient可以并发使用。

OSS - 有关于OSSClient的单例化的更多相关文章

  1. Kotlin入门(28)Application单例化

    Application是Android的又一大组件,在App运行过程中,有且仅有一个Application对象贯穿应用的整个生命周期,所以适合在Application中保存应用运行时的全局变量.而开展 ...

  2. QT中实现应用程序的单例化

    一介绍 通过编写一个QSingleApplication类,来实现Qt程序的单例化,原文的作者是在Windows Vista + Qt4.4 下实现的,不过应用在其他平台上是没问题的.(本文是我在ht ...

  3. 三、singleton(单例化)一个对象的几种方法

    方案一:私有化构造器,通过static final域 @Test public void test13() { A215 a=A215.a; A215 b=A215.a; System.out.pri ...

  4. 慎把“DataContext”静态化 或则单例

    之前在项目里由于把DataContext静态化,最后在测试阶段发现了很多奇怪的问题,后来经过同事的指点 然后上网搜了一翻终于发现 MSDN上说:   "请不要试图重用 DataContext ...

  5. 设计模式——单例设计模式(C++实现)

    #ifndef SINGLETONHOLDER_INC #define SINGLETONHOLDER_INC template<class T> class SingletonHolde ...

  6. qt 共享内存 单例

        QT 进程间通信之古老的方法(内存共享)     让QT只运行一个实例     以上两篇文章中分别讲述了QSharedMemory的不同作用,第一篇讲了进程间通信,第二篇讲述了怎么让应用程序只 ...

  7. 转--python 中写单例

    原文地址 原文地址2 Python中的单例模式的几种实现方式的及优化 阅读目录(Content) 单例模式 实现单例模式的几种方式 1.使用模块 2.使用装饰器 3.使用类 4.基于__new__方法 ...

  8. java 单例

    Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例.饿汉式单例. 饿汉式和懒汉式区别 从名字上来说,饿汉和懒汉, 饿汉就是类一旦加载,就把单例初始化完成,保证 ...

  9. iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)

    关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...

随机推荐

  1. Python--时间模块time模块

    原地址:https://finthon.com/python-time/ Python时间模块——time模块 简介 在数据处理当中,经常会碰到处理时间的问题.比如:在序列预测的过程中,需要通过学习一 ...

  2. tomcat中server.xml各项配置详解

     详见大佬的文章,乐于做大佬文章的搬运工. http://www.cnblogs.com/starhu/p/5599773.html

  3. EXTI中断开关点亮LED源码

    在KEY点亮LED源码的基础上 USER下新建EXIT文件夹,新建bsp_exit.c和bsp_exit.h,添加到工程中(魔术棒添加头文件所在文件夹) bsp_exit.h内容 #ifndef BS ...

  4. 【计算几何】Water Testing

    Water Testing 题目描述 You just bought a large piece of agricultural land, but you noticed that – accord ...

  5. springboot 集成fastDfs

    pom.xml 引入依赖 <dependency> <groupId>com.github.tobato</groupId> <artifactId>f ...

  6. centos7搭建EFK日志分析系统

    前言 EFK可能都不熟悉,实际上EFK是大名鼎鼎的日志系统ELK的一个变种 在没有分布式日志的时候,每次出问题了需要查询日志的时候,需要登录到Linux服务器,使用命令cat -n xxxx|grep ...

  7. HTML 禁止复制文字

    因为本人平时喜欢看网络小说,但是喜欢看的文通过正经网站或者app都需要收费,让人很是不爽,所以...总之,百度网盘上资源很多.但是问题来了,这些资源肯定不会是作者自己流出的,也不应该是网站或app流出 ...

  8. (九)easyUI之选项卡

    前台 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncodi ...

  9. java 框架-企业级搜索 Solr

    https://blog.csdn.net/cs_hnu_scw/article/details/79388080 一:Solr简介       Solr是一个独立的企业级搜索应用服务器,它对外提供类 ...

  10. K2 BPM_【解决方案】从流程梳理到落地,K2为企业打造流程管理闭环_全业务流程管理专家

    很多企业在进行流程管理体系建设的过程中,往往急于求成,还没有理清楚要“做什么”和“怎么做”,就开始大刀阔斧地进行改革优化.管理目标.建设标准的不统一,使得体系建设之间内容重复.要求冲突等现象层出不穷. ...