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
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;
}
}
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.
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.
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