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

时间:2019-03-08 21:20:15

标签: java amazon-web-services amazon-s3

我正在尝试从S3中读取一些文件,并对每个文件进行一些处理。我可以浏览一些文件,但是在处理过程中,我会在特定文件的同一行中不断获取 Java.net.SocketException:连接重置。有问题的文件应该可以,因为我可以使用相同的类和方法(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 个答案:

答案 0 :(得分:0)

我能够通过设置ClientConfig保持连接活跃来克服这一点

AmazonS3ClientBuilder
   .standard()
   .withCredentials(
      new DefaultAWSCredentialsProviderChain())
   .withClientConfiguration(
      new ClientConfiguration()
         .withTcpKeepAlive(true))
   .build();

答案 1 :(得分:0)

我遇到了与aws sdk 1.X 相同的问题。

奇怪的是,它在本地计算机上运行良好,并且在应用程序在服务器上运行时重置了连接。

尝试过withTcpKeepAlive(true),但结果相同,即

Java.net.SocketException:连接重置

解决方法

我尝试了withRange(startPosition,endPosition)直到读取了所有数据并且一切正常为止。

答案 2 :(得分:0)

我将s3代理升级到1.6.0,并将aws-java-sdk-s3升级到1.1.285后,连接重置问题已解决。