web-dev-qa-db-fra.com

AmazonS3: avertissement: S3AbortableInputStream: tous les octets n'ont pas été lus à partir du S3ObjectInputStream, abandonnant la connexion HTTP

Voici l'avertissement que je reçois:

S3AbortableInputStream: tous les octets n'ont pas été lus à partir du S3ObjectInputStream, abandonnant la connexion HTTP. Il s'agit probablement d'une erreur et peut entraîner un comportement sous-optimal. Demandez uniquement les octets dont vous avez besoin via un GET à distance ou vidangez le flux d'entrée après utilisation.

J'ai essayé d'utiliser try avec des ressources mais S3ObjectInputStream ne semble pas se fermer via cette méthode.

 try (S3Object s3object = s3Client.getObject(new GetObjectRequest(bucket, key));
      S3ObjectInputStream s3ObjectInputStream = s3object.getObjectContent();
      BufferedReader reader = new BufferedReader(new InputStreamReader(s3ObjectInputStream, StandardCharsets.UTF_8));
    ){
  //some code here blah blah blah
 }

J'ai également essayé ci-dessous le code et la fermeture explicite, mais cela ne fonctionne pas non plus:

S3Object s3object = s3Client.getObject(new GetObjectRequest(bucket, key));
S3ObjectInputStream s3ObjectInputStream = s3object.getObjectContent();

try (BufferedReader reader = new BufferedReader(new InputStreamReader(s3ObjectInputStream, StandardCharsets.UTF_8));
){
     //some code here blah blah
     s3ObjectInputStream.close();
     s3object.close();
}

Toute aide serait appréciée.

PS: Je ne lis que deux lignes du fichier de S3 et le fichier contient plus de données.

12
Chirag Sejpal

Vous avez la réponse via un autre support. Partagez-le ici:

L'avertissement indique que vous avez appelé close () sans lire l'intégralité du fichier. Cela est problématique car S3 essaie toujours d'envoyer les données et vous laissez la connexion dans un état triste.

Il y a deux options ici:

  1. Lisez le reste des données du flux d'entrée afin que la connexion puisse être réutilisée.
  2. Appelez s3ObjectInputStream.abort () pour fermer la connexion sans lire les données. La connexion ne sera pas réutilisée, vous tirez donc parti des performances lors de la prochaine demande pour recréer la connexion. Cela peut valoir la peine s'il faut beaucoup de temps pour lire le reste du fichier.
16
Chirag Sejpal

Pour ajouter un exemple à la réponse de Chirag Sejpal (en développant l'option # 1), ce qui suit peut être utilisé pour lire le reste des données du flux d'entrée avant de le fermer:

S3Object s3object = s3Client.getObject(new GetObjectRequest(bucket, key));

try (S3ObjectInputStream s3ObjectInputStream = s3object.getObjectContent()) {
  try {
    // Read from stream as necessary
  } catch (Exception e) {
    // Handle exceptions as necessary
  } finally {
    while (s3ObjectInputStream != null && s3ObjectInputStream.read() != -1) {
      // Read the rest of the stream
    }
  }

  // The stream will be closed automatically by the try-with-resources statement
}
0
DPG