当前位置:   article > 正文

腾讯云对象存储COS shutdown导致的血案_cosclient.shutdown

cosclient.shutdown

目录

背景介绍

问题定位

解决方案


背景介绍

标题胡乱起的

腾讯cos公司很多项目都在用,新项目基本都是拷贝老代码,一直相安无事.突然一天,工程师小李新建了一个项目,拷贝了老项目cos的代码,so happy,自测也正常

项目开发完成,小李交付测试人员测试,测试人员发现首次上传正常,但是之后就一直报错,小李瞅了半天,查了许多资料,也没找到原因

后来小李去找公司小王

小王看了一下代码,代码如下(稍微改造,简化了代码):

// 指定要上传的文件
File localFile = new File("C:\\Users\\oe_wangwenzhe\\Desktop\\tmp\\1.pdf");
// 指定文件将要存放的存储桶
String bucketName = "gongju-1259318993";
// 指定文件上传到 COS 上的路径,即对象键。例如对象键为folder/picture.jpg,则表示将文件 picture.jpg 上传到 folder 路径下
String key = System.currentTimeMillis()+"";
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
System.out.println(putObjectRequest.getCustomRequestHeaders());
// 正常上传
PutObjectResult putObjectResultSuccess = cosClient.putObject(putObjectRequest);
cosClient.shutdown();
// 关闭后,上传失败
PutObjectResult putObjectResultFail = cosClient.putObject(putObjectRequest);

点进源码:

public void run() {
    while(true) {
        try {
            if (!this.shutdown) {
                synchronized(this) {
                    this.wait(2000L);
                    this.connMgr.closeExpiredConnections();
                    this.connMgr.closeIdleConnections((long)this.idleAliveMS, TimeUnit.MILLISECONDS);
                    continue;
                }
            }
        } catch (InterruptedException var8) {
            log.error("interrupt exception occured:", var8);
        } finally {
            this.connMgr.shutdown();
        }

        return;
    }
}

发现原因是: cosClient.shutdown();最终会调用:this.connMgr.shutdown();

这很好理解,关闭了之后就报错,问题是之前项目也是这样写的,之前的项目就好好

我直接拷贝的之前的项目代码,之前的项目跑的好好的,小李小声嘟囔着

小王看了一下之前项目,确实情况和小李说的一样

小王又运行了一下之前的项目,发现之前的项目上传文件到存储桶确实是正常的,上传100次都正常

这真奇怪,大牛小王一时也没发现问题在哪里

问题定位

无意间小王点了一下老项目的shutdown,发现了问题,原来原来项目的shutdown和现在的有点不一样,老项目shutdown长这样子:

public void run() {
    try {
        while (!shutdown) {
            synchronized (this) {
                wait(MONITOR_INTERVAL_MS);
                // 关闭无效的连接
                connMgr.closeExpiredConnections();
                // 关闭空闲时间超过IDLE_ALIVE_MS的连接
                connMgr.closeIdleConnections(IDLE_ALIVE_MS, TimeUnit.MILLISECONDS);
            }
        }
    } catch (InterruptedException e) {

    }
}

少了几行代码,缺少了this.connMgr.shutdown();

终于问题找到了:老项目并没有关闭链接,而新项目关闭了链接

那为什么老项目没有关闭,新项目关闭了链接

估计是版本问题

对比了一下版本,确实是版本差异

老项目引入的cos sdk:

<dependency>
    <groupId>com.qcloud</groupId>
    <artifactId>cos_api</artifactId>
    <version>5.6.24</version>
</dependency>

新项目引入的cos sdk:

<dependency>
    <groupId>com.qcloud</groupId>
    <artifactId>cos_api</artifactId>
    <version>5.6.84</version>
</dependency>

解决方案

解决方案1:

不shutdown

解决方案2:

降低sdk版本

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/70184
推荐阅读
  

闽ICP备14008679号