在我的春季应用程序中,我使用s3 AWS客户端将文件上传到s3,但有时我会收到错误,
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
因此,作为解决这个问题的方法,我使用了下面的方法,它现在起作用了。
@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
方法中使用上面的代码块吗?有人能给我解释一下最好的方法吗?谢谢
发布于 2021-09-14 11:23:24
您还没有分享上传过程的实际代码,但我认为您的问题就在于此。所以,回答你的问题:
@NotThreadSafe
,您不应该担心这个问题。您使用生成器的目的是创建AmazonS3
客户端的一个实例。这个过程是在Spring初始化期间完成的,这意味着整个过程由单螺纹处理,因此不受潜在的同步问题的影响。请注意,前面提到的是关于AmazonS3ClientBuilder
的。创建的AmazonS3Client
对象(通过调用AmazonS3ClientBuilder#build
创建)被标记为线程安全,正如您在相关的来源中看到的那样。https://stackoverflow.com/questions/69175057
复制相似问题