Java.net.SocketException: 从S3读取文件时连接重置

6
我正在尝试从S3中读取一些文件,并对每个文件进行处理。我可以读取通过某些文件,但在处理过程中,在特定文件中的同一行中不断收到Java.net.SocketException: Connection reset错误。虽然我可以使用相同的类和方法(conversionUtils.convert())在本地处理有关文件,但这个文件应该是没问题的。
服务类:
public class FileService {

  @Inject
  private S3Utils s3utils;

  private ConversionUtils conversionUtils = new ConversionUtils();

  public void processFile() {
    List<S3ObjectSummary> files = s3utils.getAllFiles();
    List<S3Object> unprocessedFiles = s3utils.getUnprocessedFiles(files);

    for(S3Object file: unprocessedFiles) {
      InputStream content = file.getObjectContent();
      List<Record> records = conversionUtils.convert(content); //Exception thrown here
    }
  }
}

S3Utils类:

@Component
public class S3utils {
  @Inject AmazonS3 amazonS3;

  public List<S3ObjectSummary> getAllFiles() {
    ListObjectsV2Request request = new ListObjectsV2Request().withBucketName('something').withPrefix('some_prefix');
    ListObjectsV2Result result = amazonS3.listObjectsV2(request);;

    return result.getObjectSummaries();
  }

  public List<S3Object> getUnprocessedFiles(List<S3ObjectSummary> files) {
    //do some filtering here

    List<S3Object> unprocessedFiles = new ArrayList<>();
    for (S3ObjectSummary summary : filteredSummaries) {
      S3Object s3Object = amazonS3.getObject(new GetObjectRequest(summary.getBucketName(), summary.getKey()));
      unprocessedFiles.add(S3Object);
    }
    return unprocessedFiles;
  }
}

配置类:

@Configuration
public class Config {
  @Bean
  public AmazonS3 amazonS3() {
    return AmazonS3ClientBuilder.standard().withCredentials(new DefaultAWSCredentialsProviderChain()).build();
  }
}

我已经阅读了一些其他与此类似的错误线程,其中问题是AmazonS3客户端被垃圾回收,从而关闭流,但我想知道这是否也是本例的情况。对于问题有什么想法吗?谢谢。

3个回答

4

通过设置 ClientConfig 保持连接活跃,我成功地克服了这个问题。

AmazonS3ClientBuilder
   .standard()
   .withCredentials(new DefaultAWSCredentialsProviderChain())
   .withClientConfiguration(new ClientConfiguration().withTcpKeepAlive(true)) //Note withTcpKeepAlive method is on ClientConfiguration
   .build();

当我从S3存储桶读取和处理大文件时,我遇到了同样的问题。这个解决方案对我也起作用。 - Srki Rakic
我也想看看使用v2客户端的解决方案,但感谢您让我走上了正确的轨道! - ndtreviv
我看到的是:“AmazonS3ClientBuilder”类型未定义“withTcpKeepAlive(boolean)”方法。 - Roe hit
这个答案来自2019年,可能已经过时了。我不再使用aws了。请随意使用编辑功能更新它所需的更改。 - Chris

0

我将S3代理升级到1.6.0版本,同时将aws-java-sdk-s3升级到1.1.285版本,成功解决了连接重置问题。


0

我在使用aws sdk 1.X时遇到了同样的问题。

奇怪的是,在本地机器上运行良好,但在服务器上运行应用程序时会出现连接重置的情况。

尝试使用withTcpKeepAlive(true),但结果仍然相同,即

Java.net.SocketException: 连接重置

解决方法

我尝试使用withRange(startPosition,endPosition)直到读取所有数据,这样就可以解决问题了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接