Prenosi u više dijelova u Amazonu S3 s Javom

1. Pregled

U ovom uputstvu vidjet ćemo kako se rukuje prijenosima s više dijelova u Amazonu S3 pomoću AWS Java SDK.

Jednostavno rečeno, u višedijelnom prijenosu sadržaj dijelimo na manje dijelove i svaki dio prenosimo pojedinačno. Svi se dijelovi ponovno sastave po primanju.

Prijenosi u više dijelova nude sljedeće prednosti:

  • Veća propusnost - dijelove možemo prenositi paralelno
  • Jednostavniji oporavak pogreške - moramo ponovno prenijeti samo neuspjele dijelove
  • Pauziranje i nastavak prijenosa - dijelove možemo prenijeti u bilo kojem trenutku. Cijeli postupak može se pauzirati, a preostali dijelovi mogu se prenijeti kasnije

Imajte na umu da kada koristite višedijelni prijenos kod Amazona S3 svaki dio, osim posljednjeg, mora imati najmanje 5 MB.

2. Ovisnosti Mavena

Prije nego što započnemo, u naš projekt moramo dodati ovisnost AWS SDK:

 com.amazonaws aws-java-sdk 1.11.290 

Da biste pogledali najnoviju verziju, pogledajte Maven Central.

3. Izvođenje višedijelnog slanja

3.1. Izrada Amazon S3 klijenta

Prvo, trebamo stvoriti klijent za pristup Amazonu S3. Koristit ćemo AmazonS3ClientBuilder za ovu svrhu:

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

To stvara klijenta koji koristi zadani lanac davatelja vjerodajnica za pristup vjerodajnicama AWS.

Za više detalja o tome kako funkcionira zadani lanac davatelja vjerodajnica, pogledajte dokumentaciju. Ako koristite regiju koja nije zadana (SAD zapad-2), obavezno zamijenite Regije.DEFAULT_REGION s tom prilagođenom regijom.

3.2. Stvaranje TransferManager-a za upravljanje prijenosima

Koristit ćemo TransferManagerBuilder stvoriti a TransferManager primjer.

Ovaj sat pruža jednostavne API-je za upravljanje prijenosima i preuzimanjima s Amazon S3 i upravlja svim povezanim zadacima:

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

Prag višedijelnog prijenosa određuje veličinu u bajtovima iznad koje bi se prijenos trebao izvršiti kao prijenos više dijelova.

Amazon S3 nameće minimalnu veličinu dijela od 5 MB (za dijelove koji nisu zadnji dio), pa smo koristili 5 MB kao prag za prijenos više dijelova.

3.3. Prijenos objekta

Za prijenos objekta pomoću TransferManager jednostavno ga moramo nazvati Učitaj() funkcija. Ovo paralelno prenosi dijelove:

Niz bucketName = "baeldung-kanta"; String keyName = "moja-slika.jpg"; String datoteka = nova datoteka ("documents / my-picture.jpg"); Prijenos upload = tm.upload (ime segmenta, ime ključa, datoteka);

TransferManager.upload () vraća an Učitaj objekt. To se može koristiti za provjeru statusa prijenosa i upravljanje njima. To ćemo učiniti u sljedećem odjeljku.

3.4. Čekanje da se prijenos završi

TransferManager.upload () je funkcija koja ne blokira; vraća se odmah dok prijenos traje u pozadini.

Možemo koristite vraćeno Učitaj objekt čekati završetak prijenosa prije izlaska iz programa:

pokušajte {upload.waitForCompletion (); } catch (AmazonClientException e) {// ...}

3.5. Praćenje napretka prijenosa

Praćenje napretka prijenosa prilično je čest zahtjev; to možemo učiniti uz pomoć a StrrogressListener primjer:

ProgressListener progressListener = progressEvent -> System.out.println ("Preneseni bajtovi:" + progressEvent.getBytesTransferred ()); Zahtjev PutObjectRequest = novi PutObjectRequest (Ime segmenta, Ime ključa, datoteka); request.setGeneralProgressListener (progressListener); Upload upload = tm.upload (zahtjev);

The ProgressListener koji smo stvorili, jednostavno ćemo nastaviti ispisivati ​​broj prenesenih bajtova dok se prijenos ne dovrši.

3.6. Kontrola paralelizma prijenosa

Prema zadanim postavkama, TransferManager koristi najviše deset niti za obavljanje višedijelnih prijenosa.

Međutim, to možemo kontrolirati određivanjem ExecutorService dok je gradio TransferManager:

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

Ovdje smo koristili lambda za stvaranje omotača implementacije IzvršiteljFactory i predao ga withExecutorFactory () funkcija.

4. Zaključak

U ovom kratkom članku naučili smo kako izvoditi višedijelne prijenose pomoću AWS SDK-a za Javu i vidjeli smo kako kontrolirati neke aspekte prijenosa i pratiti njegov napredak.

Kao i uvijek, cjelovit kôd ovog članka dostupan je na GitHub-u.