2
votes

Java.net.SocketException: réinitialisation de la connexion lors de la lecture d'un fichier depuis S3

J'essaie de lire certains fichiers de S3 et de faire un traitement sur chaque fichier. Je peux parcourir certains fichiers, mais j'obtiens toujours Java.net.SocketException: Connection reset sur la même ligne dans un fichier particulier pendant le traitement. Le fichier en question devrait cependant être correct car je peux le traiter localement en utilisant la même classe et la même méthode (conversionUtils.convert ()).

Classe de service:

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

S3Utils class:

@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;
  }
}

Classe de configuration:

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
    }
  }
}

J'ai lu d'autres threads avec des erreurs similaires où le problème était que le client AmazonS3 était en cours de collecte des ordures et fermait donc le flux, mais je me demande si c'est le cas ici. Des idées sur quel est le problème? Merci.


0 commentaires

3 Réponses :


2
votes

J'ai pu surmonter ce problème en configurant ClientConfig pour maintenir la connexion active

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


3 commentaires

J'ai rencontré le même problème lors de la lecture et du traitement de gros fichiers hors du compartiment S3. Cette solution a fonctionné pour moi aussi.


J'aimerais également voir la solution lors de l'utilisation du client v2, mais merci de m'avoir mis sur la bonne voie!


Désolé, je ne travaille plus avec AWS. Passé à Azure. Bonne chance!



0
votes

J'ai rencontré le même problème avec aws sdk 1.X .

Ce qui est étrange, c'est que cela fonctionne bien dans la machine locale et la connexion réinitialisée pendant que l'application s'exécute sur le serveur.

Essayé avec withTcpKeepAlive (true) , mais le résultat était le même, c'est-à-dire

Java.net.SocketException: réinitialisation de la connexion

Une solution de contournement

J'ai essayé withRange (startPosition, endPosition) jusqu'à ce que j'ai lu toutes les données et que cela a fonctionné.


0 commentaires

0
votes

Après avoir mis à niveau le proxy s3 vers 1.6.0 et aws-java-sdk-s3 vers 1.1.285, le problème de réinitialisation de la connexion est résolu.


0 commentaires