Der folgende Fehler ist beim Abrufen eines Objekts aus S3 aufgetreten.
org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
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;
}
}
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.
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.
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