[JAVA] N'oubliez pas de relâcher lorsque vous récupérez l'objet de S3!

environnement

phénomène

L'erreur suivante s'est produite lors de la récupération d'un objet à partir de S3.

org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool

Code en question

public InputStream getFile(String bucketName,String prefix){
  try{
    GetObjectRequest request = new GetObjectRequest(bucketName, prefix);
    S3Object object = s3client.getObject(request); //s3client a été généré en tant que variable d'instance singleton
    return object.getObjectContent();
  } catch(AmazonServiceException e){
    throw e;
  }
}

Cause

Parce que le processus de publication n'a pas été effectué lors de l'acquisition de S3Object. Il a une taille de pool de connexion HTTP à l'intérieur de S3 et par défaut 50 </ b>. Si cela est dépassé, l'erreur ci-dessus se produira.

Solution

Partie 1 Lors de l'utilisation de la classe wrapper du client S3

public InputStream getFile(String bucketName,String prefix){
  GetObjectRequest request = new GetObjectRequest(bucketName, prefix);
  try(S3Object object = s3client.getObject(request)){
    //Développez en mémoire. Supprimez la référence S3Object ici
    byte[] file = IOUtils.toByteArray(object.getObjectContent());
    // byte[]Retourner comme InputStream de
    return new ByteArrayInputStream(file);
  } catch(AmazonServiceException e){
    throw e;
  } catch(IOException e){
    throw new RuntimeException(e);
  }
}

Veuillez noter qu'il est temporairement étendu en mémoire. </ font> </ b> InputStream ne peut pas être retourné tel quel à cause du processus de publication.

Partie 2 Lorsque l'appelant libère

public static main(String[] args){
  try(S3Object object = getFile("hoge","fuga")){
~ traitement ~
  }catch (IOException e) {
    throw new RuntimeException(e);
  }
}

public S3Object getFile(String bucketName,String prefix){
  try{
    GetObjectRequest request = new GetObjectRequest(bucketName, prefix);
    return s3client.getObject(request);
  } catch(AmazonServiceException e){
    throw e;
  }
}

Il est nécessaire d'effectuer un traitement de libération pour chaque appel, mais il peut gérer InputStream.

Recommended Posts