5454 */
5555
5656public class AbortMultipartUploadExamples {
57- static final String bucketName = "amzn-s3-demo-bucket" + UUID .randomUUID (); // Change bucket name.
58- static final String key = UUID .randomUUID ().toString ();
57+ static final S3Client s3Client = S3Client .create ();
5958 static final String classPathFilePath = "/multipartUploadFiles/s3-userguide.pdf" ;
6059 static final String filePath = getFullFilePath (classPathFilePath );
61- static final S3Client s3Client = S3Client .create ();
6260 private static final Logger logger = LoggerFactory .getLogger (AbortMultipartUploadExamples .class );
63- private static String accountId = getAccountId ();
61+ private static final String accountId = getAccountId ();
6462
6563 public static void main (String [] args ) {
66- doAbortIncompleteMultipartUploadsFromList ();
67- doAbortMultipartUploadUsingUploadId ();
68- doAbortIncompleteMultipartUploadsOlderThan ();
69- doAbortMultipartUploadsUsingLifecycleConfig ();
70- }
64+ String bucketName = "amzn-s3-demo-bucket" ; // Replace with your bucket name.
65+ String key = UUID .randomUUID ().toString ();
7166
72- // A wrapper method that sets up the multipart upload environment for abortIncompleteMultipartUploadsFromList().
73- public static void doAbortIncompleteMultipartUploadsFromList () {
74- createBucket ();
75- initiateAndInterruptMultiPartUpload ("uploadThread" );
76- abortIncompleteMultipartUploadsFromList ();
77- deleteResources ();
67+ createBucket (bucketName );
68+ try {
69+ initiateAndInterruptMultiPartUpload (bucketName , key , "uploadThread" );
70+ abortIncompleteMultipartUploadsFromList (bucketName );
71+ abortMultipartUploadUsingUploadId (bucketName , key );
72+ abortMultipartUploadsUsingLifecycleConfig (bucketName );
73+ } catch (S3Exception e ) {
74+ logger .error (e .getMessage ());
75+ } finally {
76+ deleteResources (bucketName , key );
77+ }
7878 }
7979
8080 // snippet-start:[s3.java2.abort_upload_from_list]
8181 /**
8282 * Aborts all incomplete multipart uploads from the specified S3 bucket.
83- * <p>
84- * This method retrieves a list of all incomplete multipart uploads in the specified S3 bucket,
85- * and then aborts each of those uploads.
83+ *
84+ * @param bucketName the name of the S3 bucket
8685 */
87- public static void abortIncompleteMultipartUploadsFromList () {
86+ public static void abortIncompleteMultipartUploadsFromList (String bucketName ) {
8887 ListMultipartUploadsRequest listMultipartUploadsRequest = ListMultipartUploadsRequest .builder ()
8988 .bucket (bucketName )
9089 .build ();
@@ -109,16 +108,14 @@ public static void abortIncompleteMultipartUploadsFromList() {
109108 }
110109 // snippet-end:[s3.java2.abort_upload_from_list]
111110
112- // A wrapper method that sets up the multipart upload environment for abortIncompleteMultipartUploadsOlderThan().
113- static void doAbortIncompleteMultipartUploadsOlderThan () {
114- createBucket ();
115- Instant secondUploadInstant = initiateAndInterruptTwoUploads ();
116- abortIncompleteMultipartUploadsOlderThan (secondUploadInstant );
117- deleteResources ();
118- }
119-
120111 // snippet-start:[s3.java2.abort_upload_older_than]
121- static void abortIncompleteMultipartUploadsOlderThan (Instant pointInTime ) {
112+ /**
113+ * Aborts incomplete multipart uploads older than the specified point in time.
114+ *
115+ * @param bucketName the name of the S3 bucket
116+ * @param pointInTime the cutoff time; uploads initiated before this are aborted
117+ */
118+ static void abortIncompleteMultipartUploadsOlderThan (String bucketName , Instant pointInTime ) {
122119 ListMultipartUploadsRequest listMultipartUploadsRequest = ListMultipartUploadsRequest .builder ()
123120 .bucket (bucketName )
124121 .build ();
@@ -146,21 +143,15 @@ static void abortIncompleteMultipartUploadsOlderThan(Instant pointInTime) {
146143 }
147144 // snippet-end:[s3.java2.abort_upload_older_than]
148145
149- // A wrapper method that sets up the multipart upload environment for abortMultipartUploadUsingUploadId().
150- static void doAbortMultipartUploadUsingUploadId () {
151- createBucket ();
152- try {
153- abortMultipartUploadUsingUploadId ();
154- } catch (S3Exception e ) {
155- logger .error (e .getMessage ());
156- } finally {
157- deleteResources ();
158- }
159- }
160-
161146 // snippet-start:[s3.java2.abort_upload_using_upload_id]
162- static void abortMultipartUploadUsingUploadId () {
163- String uploadId = startUploadReturningUploadId ();
147+ /**
148+ * Aborts a multipart upload using the upload ID.
149+ *
150+ * @param bucketName the name of the S3 bucket
151+ * @param key the object key
152+ */
153+ static void abortMultipartUploadUsingUploadId (String bucketName , String key ) {
154+ String uploadId = startUploadReturningUploadId (bucketName , key );
164155 AbortMultipartUploadResponse response = s3Client .abortMultipartUpload (b -> b
165156 .uploadId (uploadId )
166157 .bucket (bucketName )
@@ -172,28 +163,20 @@ static void abortMultipartUploadUsingUploadId() {
172163 }
173164 // snippet-end:[s3.java2.abort_upload_using_upload_id]
174165
175- // A wrapper method that sets up the multipart upload environment for abortMultipartUploadsUsingLifecycleConfig().
176- static void doAbortMultipartUploadsUsingLifecycleConfig () {
177- createBucket ();
178- try {
179- abortMultipartUploadsUsingLifecycleConfig ();
180- } catch (S3Exception e ) {
181- logger .error (e .getMessage ());
182- } finally {
183- deleteResources ();
184- }
185- }
186-
187166 // snippet-start:[s3.java2.abort_upload_using_lifecycle_config]
188- static void abortMultipartUploadsUsingLifecycleConfig () {
167+ /**
168+ * Configures a lifecycle rule to abort incomplete multipart uploads after 7 days.
169+ *
170+ * @param bucketName the name of the S3 bucket
171+ */
172+ static void abortMultipartUploadsUsingLifecycleConfig (String bucketName ) {
189173 Collection <LifecycleRule > lifeCycleRules = List .of (LifecycleRule .builder ()
190174 .abortIncompleteMultipartUpload (b -> b .
191175 daysAfterInitiation (7 ))
192176 .status ("Enabled" )
193177 .filter (SdkBuilder ::build ) // Filter element is required.
194178 .build ());
195179
196- // If the action is successful, the service sends back an HTTP 200 response with an empty HTTP body.
197180 PutBucketLifecycleConfigurationResponse response = s3Client .putBucketLifecycleConfiguration (b -> b
198181 .bucket (bucketName )
199182 .lifecycleConfiguration (b1 -> b1 .rules (lifeCycleRules )));
@@ -210,51 +193,50 @@ static void abortMultipartUploadsUsingLifecycleConfig() {
210193 Multipart upload methods
211194 ***********************/
212195
213- static void initiateAndInterruptMultiPartUpload (String threadName ) {
196+ static void initiateAndInterruptMultiPartUpload (String bucketName , String key , String threadName ) {
214197 Runnable upload = () -> {
215198 try {
216- AbortMultipartUploadExamples . doMultipartUpload ();
199+ doMultipartUpload (bucketName , key );
217200 } catch (SdkException e ) {
218201 logger .error (e .getMessage ());
219202 }
220203 };
221204 Thread uploadThread = new Thread (upload , threadName );
222205 uploadThread .start ();
223206 try {
224- Thread .sleep (Duration .ofSeconds (1 ).toMillis ()); // Give the multipart upload time to register.
207+ Thread .sleep (Duration .ofSeconds (1 ).toMillis ());
225208 } catch (InterruptedException e ) {
226209 logger .error (e .getMessage ());
227210 }
228211 uploadThread .interrupt ();
229212 }
230213
231- static Instant initiateAndInterruptTwoUploads () {
232- Instant firstUploadInstant = Instant .now ();
233- initiateAndInterruptMultiPartUpload ("uploadThread1" );
214+ static Instant initiateAndInterruptTwoUploads (String bucketName , String key ) {
215+ initiateAndInterruptMultiPartUpload (bucketName , key , "uploadThread1" );
234216 try {
235217 Thread .sleep (Duration .ofSeconds (5 ).toMillis ());
236218 } catch (InterruptedException e ) {
237219 logger .error (e .getMessage ());
238220 }
239221 Instant secondUploadInstant = Instant .now ();
240- initiateAndInterruptMultiPartUpload ("uploadThread2" );
222+ initiateAndInterruptMultiPartUpload (bucketName , key , "uploadThread2" );
241223 return secondUploadInstant ;
242224 }
243225
244- static void doMultipartUpload () {
245- String uploadId = step1CreateMultipartUpload ();
246- List <CompletedPart > completedParts = step2UploadParts (uploadId );
247- step3CompleteMultipartUpload (uploadId , completedParts );
226+ static void doMultipartUpload (String bucketName , String key ) {
227+ String uploadId = step1CreateMultipartUpload (bucketName , key );
228+ List <CompletedPart > completedParts = step2UploadParts (bucketName , key , uploadId );
229+ step3CompleteMultipartUpload (bucketName , key , uploadId , completedParts );
248230 }
249231
250- static String step1CreateMultipartUpload () {
232+ static String step1CreateMultipartUpload (String bucketName , String key ) {
251233 CreateMultipartUploadResponse createMultipartUploadResponse = s3Client .createMultipartUpload (b -> b
252234 .bucket (bucketName )
253235 .key (key ));
254236 return createMultipartUploadResponse .uploadId ();
255237 }
256238
257- static List <CompletedPart > step2UploadParts (String uploadId ) {
239+ static List <CompletedPart > step2UploadParts (String bucketName , String key , String uploadId ) {
258240 int partNumber = 1 ;
259241 List <CompletedPart > completedParts = new ArrayList <>();
260242 ByteBuffer bb = ByteBuffer .allocate (Long .valueOf (1024 * KB ).intValue ());
@@ -266,7 +248,7 @@ static List<CompletedPart> step2UploadParts(String uploadId) {
266248 file .seek (position );
267249 long read = file .getChannel ().read (bb );
268250
269- bb .flip (); // Swap position and limit before reading from the buffer.
251+ bb .flip ();
270252 UploadPartRequest uploadPartRequest = UploadPartRequest .builder ()
271253 .bucket (bucketName )
272254 .key (key )
@@ -296,26 +278,25 @@ static List<CompletedPart> step2UploadParts(String uploadId) {
296278 return completedParts ;
297279 }
298280
299- static void step3CompleteMultipartUpload (String uploadId , List <CompletedPart > completedParts ) {
281+ static void step3CompleteMultipartUpload (String bucketName , String key , String uploadId , List <CompletedPart > completedParts ) {
300282 s3Client .completeMultipartUpload (b -> b
301283 .bucket (bucketName )
302284 .key (key )
303285 .uploadId (uploadId )
304286 .multipartUpload (CompletedMultipartUpload .builder ().parts (completedParts ).build ()));
305287 }
306288
307- static String startUploadReturningUploadId () {
308- String uploadId = step1CreateMultipartUpload ();
309- doMultipartUploadWithUploadId (uploadId );
289+ static String startUploadReturningUploadId (String bucketName , String key ) {
290+ String uploadId = step1CreateMultipartUpload (bucketName , key );
291+ doMultipartUploadWithUploadId (bucketName , key , uploadId );
310292 return uploadId ;
311-
312293 }
313294
314- static void doMultipartUploadWithUploadId (String uploadId ) {
295+ static void doMultipartUploadWithUploadId (String bucketName , String key , String uploadId ) {
315296 new Thread (() -> {
316297 try {
317- List <CompletedPart > completedParts = step2UploadParts (uploadId );
318- step3CompleteMultipartUpload (uploadId , completedParts );
298+ List <CompletedPart > completedParts = step2UploadParts (bucketName , key , uploadId );
299+ step3CompleteMultipartUpload (bucketName , key , uploadId , completedParts );
319300 } catch (SdkException e ) {
320301 logger .error (e .getMessage ());
321302 }
@@ -332,7 +313,7 @@ static void doMultipartUploadWithUploadId(String uploadId) {
332313 Resource handling methods
333314 ************************/
334315
335- static void createBucket () {
316+ static void createBucket (String bucketName ) {
336317 logger .info ("Creating bucket: [{}]" , bucketName );
337318 s3Client .createBucket (b -> b .bucket (bucketName ));
338319 try (S3Waiter s3Waiter = s3Client .waiter ()) {
@@ -341,7 +322,7 @@ static void createBucket() {
341322 logger .info ("Bucket created." );
342323 }
343324
344- static void deleteResources () {
325+ static void deleteResources (String bucketName , String key ) {
345326 logger .info ("Deleting resources ..." );
346327 s3Client .deleteObject (b -> b .bucket (bucketName ).key (key ));
347328 s3Client .deleteBucket (b -> b .bucket (bucketName ));
@@ -368,4 +349,4 @@ static String getFullFilePath(String filePath) {
368349 return fullFilePath ;
369350 }
370351}
371- // snippet-end:[s3.java2.abort_multipart_uploads.main]
352+ // snippet-end:[s3.java2.abort_multipart_uploads.main]
0 commit comments