Caricamenti in più parti in Amazon S3 con Java

1. Panoramica

In questo tutorial, vedremo come gestire i caricamenti in più parti in Amazon S3 con AWS Java SDK.

In poche parole, in un caricamento in più parti, suddividiamo il contenuto in parti più piccole e carichiamo ogni parte individualmente. Tutte le parti vengono riassemblate una volta ricevute.

I caricamenti in più parti offrono i seguenti vantaggi:

  • Produttività più elevata: possiamo caricare parti in parallelo
  • Ripristino degli errori più semplice: dobbiamo ricaricare solo le parti guaste
  • Metti in pausa e riprendi i caricamenti: possiamo caricare parti in qualsiasi momento. L'intero processo può essere messo in pausa e le parti rimanenti possono essere caricate in un secondo momento

Tieni presente che quando utilizzi il caricamento in più parti con Amazon S3, ogni parte tranne l'ultima deve avere una dimensione di almeno 5 MB.

2. Dipendenze di Maven

Prima di iniziare, dobbiamo aggiungere la dipendenza AWS SDK nel nostro progetto:

 com.amazonaws aws-java-sdk 1.11.290 

Per visualizzare l'ultima versione, controlla Maven Central.

3. Esecuzione del caricamento in più parti

3.1. Creazione del client Amazon S3

Innanzitutto, dobbiamo creare un client per accedere ad Amazon S3. Useremo AmazonS3ClientBuilder per questo scopo:

AmazonS3 amazonS3 = AmazonS3ClientBuilder .standard() .withCredentials(new DefaultAWSCredentialsProviderChain()) .withRegion(Regions.DEFAULT_REGION) .build();

In questo modo viene creato un client utilizzando la catena del provider di credenziali predefinito per accedere alle credenziali AWS.

Per ulteriori dettagli su come funziona la catena di provider di credenziali predefinite, consultare la documentazione. Se stai utilizzando una regione diversa da quella predefinita ( Stati Uniti occidentali-2 ), assicurati di sostituire Regions.DEFAULT_REGION con quella regione personalizzata.

3.2. Creazione di TransferManager per la gestione dei caricamenti

Useremo TransferManagerBuilder per creare un'istanza di TransferManager .

Questa classe fornisce API semplici per gestire caricamenti e download con Amazon S3 e gestisce tutte le attività correlate:

TransferManager tm = TransferManagerBuilder.standard() .withS3Client(amazonS3) .withMultipartUploadThreshold((long) (5 * 1024 * 1025)) .build();

La soglia di caricamento in più parti specifica la dimensione, in byte, al di sopra della quale il caricamento deve essere eseguito come caricamento in più parti.

Amazon S3 impone una dimensione minima della parte di 5 MB (per parti diverse dall'ultima parte), quindi abbiamo utilizzato 5 MB come soglia di caricamento in più parti.

3.3. Caricamento di un oggetto

Per caricare oggetto utilizzando TransferManager abbiamo semplicemente bisogno di chiamare il suo upload () la funzione . Questo carica le parti in parallelo:

String bucketName = "baeldung-bucket"; String keyName = "my-picture.jpg"; String file = new File("documents/my-picture.jpg"); Upload upload = tm.upload(bucketName, keyName, file);

TransferManager.upload () restituisce un oggetto Upload . Può essere utilizzato per controllare lo stato e gestire i caricamenti. Lo faremo nella prossima sezione.

3.4. In attesa del completamento del caricamento

TransferManager.upload () è una funzione non bloccante ; ritorna immediatamente mentre il caricamento viene eseguito in background.

Possiamo utilizzare l' oggetto Upload restituito per attendere il completamento del caricamento prima di uscire dal programma:

try { upload.waitForCompletion(); } catch (AmazonClientException e) { // ... }

3.5. Monitoraggio dell'avanzamento del caricamento

Tenere traccia dell'avanzamento del caricamento è un requisito abbastanza comune; possiamo farlo con l'aiuto di un'istanza di P rogressListener :

ProgressListener progressListener = progressEvent -> System.out.println( "Transferred bytes: " + progressEvent.getBytesTransferred()); PutObjectRequest request = new PutObjectRequest( bucketName, keyName, file); request.setGeneralProgressListener(progressListener); Upload upload = tm.upload(request);

Il ProgressListener che abbiamo creato continuerà semplicemente a stampare il numero di byte trasferiti fino al completamento del caricamento.

3.6. Controllo del parallelismo di caricamento

Per impostazione predefinita, TransferManager utilizza un massimo di dieci thread per eseguire caricamenti in più parti.

Tuttavia, possiamo controllarlo specificando un ExecutorService durante la creazione di TransferManager :

int maxUploadThreads = 5; TransferManager tm = TransferManagerBuilder.standard() .withS3Client(amazonS3) .withMultipartUploadThreshold((long) (5 * 1024 * 1025)) .withExecutorFactory(() -> Executors.newFixedThreadPool(maxUploadThreads)) .build();

Qui, abbiamo usato un lambda per creare un'implementazione wrapper di ExecutorFactory e l'abbiamo passato alla funzione withExecutorFactory () .

4. Conclusione

In questo breve articolo, abbiamo imparato come eseguire caricamenti in più parti utilizzando AWS SDK per Java e abbiamo visto come controllare alcuni aspetti del caricamento e tenerne traccia dell'avanzamento.

Come sempre, il codice completo di questo articolo è disponibile su GitHub.