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.
3 Réponses :
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();
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!
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
J'ai essayé withRange (startPosition, endPosition)
jusqu'à ce que j'ai lu toutes les données et que cela a fonctionné.
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.