[JAVA] Vergessen Sie nicht freizugeben, wenn Sie das Objekt von S3 erhalten!

Umgebung

Phänomen

Der folgende Fehler ist beim Abrufen eines Objekts aus S3 aufgetreten.

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

Code in Frage

public InputStream getFile(String bucketName,String prefix){
  try{
    GetObjectRequest request = new GetObjectRequest(bucketName, prefix);
    S3Object object = s3client.getObject(request); //s3client wurde als Singleton-Instanzvariable generiert
    return object.getObjectContent();
  } catch(AmazonServiceException e){
    throw e;
  }
}

Ursache

Weil der Freigabeprozess nicht ausgeführt wurde, als das S3Object erfasst wurde. Es hat eine HTTP-Verbindungspoolgröße in S3 und ist standardmäßig 50 </ b>. Wenn dies überschritten wird, tritt der obige Fehler auf.

Lösungen

Teil 1 Bei Verwendung der Wrapper-Klasse des S3-Clients

public InputStream getFile(String bucketName,String prefix){
  GetObjectRequest request = new GetObjectRequest(bucketName, prefix);
  try(S3Object object = s3client.getObject(request)){
    //In den Speicher erweitern. Entfernen Sie hier die S3Object-Referenz
    byte[] file = IOUtils.toByteArray(object.getObjectContent());
    // byte[]Rückkehr als InputStream von
    return new ByteArrayInputStream(file);
  } catch(AmazonServiceException e){
    throw e;
  } catch(IOException e){
    throw new RuntimeException(e);
  }
}

Bitte beachten Sie, dass es vorübergehend im Speicher erweitert wird. </ font> </ b> `` `InputStream``` kann nicht zurückgegeben werden, da dies auf den Release-Prozess zurückzuführen ist.

Teil 2 Wenn der Anrufer loslässt

public static main(String[] args){
  try(S3Object object = getFile("hoge","fuga")){
~ Verarbeitung ~
  }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;
  }
}

Es ist notwendig, für jeden Aufruf eine Freigabeverarbeitung durchzuführen, aber es kann "InputStream" verarbeiten.

Recommended Posts