首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在多线程中将文件上传到S3

在多线程中将文件上传到S3
EN

Stack Overflow用户
提问于 2021-09-14 09:13:06
回答 1查看 982关注 0票数 1

在我的春季应用程序中,我使用s3 AWS客户端将文件上传到s3,但有时我会收到错误,

代码语言:javascript
运行
复制
com.amazonaws.SdkClientException: Unable to execute HTTP request: Timeout waiting for connection from pool
com.amazonaws.SdkClientException: Unable to execute HTTP request: Timeout waiting for connection from pool
Caused by: org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool

因此,作为解决这个问题的方法,我使用了下面的方法,它现在起作用了。

代码语言:javascript
运行
复制
@Bean
public AmazonS3 s3Client() {
    return AmazonS3ClientBuilder
            .standard()
            .withClientConfiguration(new ClientConfiguration()
                    .withMaxConnections(100)
                    .withConnectionTimeout(100)
                    .withMaxErrorRetry(5))
            .build();
}

public String uploadFile() {
    // upload code
}

我把它作为Spring来创建。但是我在多线程环境中使用这个。因此,同时会有许多并发请求。我看到AmazonS3ClientBuilder@NotThreadSafe注释了。因此,我需要知道,在多线程中将它用作bean可以吗?否则,我应该在同一个uploadFile方法中使用上面的代码块吗?有人能给我解释一下最好的方法吗?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-14 11:23:24

您还没有分享上传过程的实际代码,但我认为您的问题就在于此。所以,回答你的问题:

  1. 关于@NotThreadSafe,您不应该担心这个问题。您使用生成器的目的是创建AmazonS3客户端的一个实例。这个过程是在Spring初始化期间完成的,这意味着整个过程由单螺纹处理,因此不受潜在的同步问题的影响。请注意,前面提到的是关于AmazonS3ClientBuilder的。创建的AmazonS3Client对象(通过调用AmazonS3ClientBuilder#build创建)被标记为线程安全,正如您在相关的来源中看到的那样。
  2. 关于你正在经历的问题。不幸的是,如果没有共享上传对象逻辑,就没有具体的方法来理解它的确切原因。但是,我认为您的问题源于这样一个事实,即您正在创建多个并发上传请求,这些请求高于配置的最大连接号。这反过来会导致这些请求被阻塞,等待从http池检索连接。如果无法及时检索,则请求将超时(您正在经历的情况)。要了解更多信息,您可以查看相关问题这里,它概述了您正在获得的相同行为,尽管是下载操作。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69175057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档