Przeglądaj źródła

s3冻结解冻工具

dsx 2 lat temu
rodzic
commit
5c8ecc8945

+ 114 - 40
4dkankan-utils-fyun-s3/src/main/java/com/fdkankan/fyun/s3/S3FileService.java

@@ -1,8 +1,14 @@
 package com.fdkankan.fyun.s3;
 
 import cn.hutool.core.collection.CollUtil;
+import com.amazonaws.ClientConfiguration;
 import com.amazonaws.HttpMethod;
+import com.amazonaws.auth.AWSStaticCredentialsProvider;
+import com.amazonaws.auth.BasicAWSCredentials;
+import com.amazonaws.client.builder.AwsClientBuilder;
+import com.amazonaws.regions.Regions;
 import com.amazonaws.services.s3.AmazonS3;
+import com.amazonaws.services.s3.AmazonS3ClientBuilder;
 import com.amazonaws.services.s3.model.*;
 import com.fdkankan.fyun.constant.FYunTypeEnum;
 import com.fdkankan.fyun.face.AbstractFYunFileService;
@@ -15,6 +21,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.util.ObjectUtils;
 
 import java.io.*;
+import java.math.BigDecimal;
 import java.net.URL;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -25,6 +32,20 @@ public class S3FileService extends AbstractFYunFileService {
 
     private Logger log = LoggerFactory.getLogger(this.getClass().getName());
 
+    public static AmazonS3 amazonS3(){
+        BasicAWSCredentials awsCreds = new BasicAWSCredentials("AKIAWCV5QFZ3ZNELKYUY", "epS5ghyR4LJ7rxk/qJO9ZYh6m9Oz6g5haKDu4yws");
+        ClientConfiguration clientConfiguration = new ClientConfiguration();
+        clientConfiguration.setMaxErrorRetry(4);
+        clientConfiguration.setMaxConnections(100);
+        AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration("test-4dkankan.s3.eu-west-2.amazonaws.com",Regions.EU_WEST_2.getName());
+        return AmazonS3ClientBuilder.standard()
+                .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
+                .withEndpointConfiguration(endpointConfiguration)
+                .withClientConfiguration(clientConfiguration)
+//                .withRegion(Regions.EU_WEST_2).
+                        .build();
+    }
+
     @Autowired
     private AmazonS3 s3;
 
@@ -343,43 +364,29 @@ public class S3FileService extends AbstractFYunFileService {
 
     @Override
     public void restoreFile(String bucket, String objectName, Integer priority){
-//        ObjectMetadata objectMetadata = ossClient.getObjectMetadata(bucket, objectName);
-//
-//        // 校验Object是否为归档类型Object。
-//        StorageClass storageClass = objectMetadata.getObjectStorageClass();
-//        if (storageClass == StorageClass.ColdArchive) {
-//            // 设置解冻冷归档Object的优先级。
-//            // RestoreTier.RESTORE_TIER_EXPEDITED 表示1小时内完成解冻。
-//            // RestoreTier.RESTORE_TIER_STANDARD 表示2~5小时内完成解冻。
-//            // RestoreTier.RESTORE_TIER_BULK 表示5~12小时内完成解冻。
-//            RestoreTier restoreTier = null;
-//            switch (priority){
-//                case 1 :
-//                    restoreTier = RestoreTier.RESTORE_TIER_EXPEDITED;
-//                    break;
-//                case 2 :
-//                    restoreTier = RestoreTier.RESTORE_TIER_STANDARD;
-//                    break;
-//                default:
-//                    restoreTier = RestoreTier.RESTORE_TIER_BULK;
-//            }
-//            RestoreJobParameters jobParameters = new RestoreJobParameters(restoreTier);
-//            // 配置解冻参数,以设置5小时内解冻完成,解冻状态保持2天为例。
-//            // 第一个参数表示保持解冻状态的天数,默认是1天,此参数适用于解冻Archive(归档)与ColdArchive(冷归档)类型Object。
-//            // 第二个参数jobParameters表示解冻优先级,只适用于解冻ColdArchive类型Object。
-//            RestoreConfiguration configuration = new RestoreConfiguration(1, jobParameters);
-//            //开始解冻
-//            ossClient.restoreObject(bucket, objectName, configuration);
-////            // 等待解冻完成。
-////            do {
-////                try {
-////                    Thread.sleep(1000);
-////                } catch (InterruptedException e) {
-////                    e.printStackTrace();
-////                }
-////                objectMetadata = ossClient.getObjectMetadata(bucket, objectName);
-////            } while (!objectMetadata.isRestoreCompleted());
-//        }
+        ObjectMetadata objectMetadata = s3.getObjectMetadata(bucket, objectName);
+
+        // 校验Object是否为归档类型Object。
+        StorageClass storageClass = StorageClass.fromValue(objectMetadata.getStorageClass());
+        if (storageClass == StorageClass.Glacier) {
+            Tier restoreTier = null;
+            switch (priority){
+                case 1 :
+                    restoreTier = Tier.Expedited;
+                    break;
+                case 2 :
+                    restoreTier = Tier.Standard;
+                    break;
+                default:
+                    restoreTier = Tier.Bulk;
+            }
+            RestoreObjectRequest requestRestore = new RestoreObjectRequest(bucket, objectName, 1);
+            GlacierJobParameters glacierJobParameters = new GlacierJobParameters();
+            glacierJobParameters.setTier(restoreTier);
+            requestRestore.setGlacierJobParameters(glacierJobParameters);
+            //开始解冻
+            s3.restoreObjectV2(requestRestore);
+        }
     }
 
     @Override
@@ -407,8 +414,8 @@ public class S3FileService extends AbstractFYunFileService {
         for (String objectName : objectList) {
             objectMetadata = s3.getObjectMetadata(bucket, objectName);
             // 校验Object是否为归档类型Object。
-            StorageClass storageClass = objectMetadata.getArchiveStatus();
-            if (storageClass == StorageClass.) {
+            StorageClass storageClass = StorageClass.fromValue(objectMetadata.getStorageClass());
+            if (storageClass == StorageClass.Glacier) {
                 // 解冻Object。
                 RestoreObjectRequest requestRestore = new RestoreObjectRequest(bucket, url, 1);
                 s3.restoreObjectV2(requestRestore);
@@ -418,7 +425,26 @@ public class S3FileService extends AbstractFYunFileService {
 
     @Override
     public Integer getRestoreFolderProcess(String bucket, String url) {
-        return null;
+        ObjectMetadata objectMetadata ;
+
+        List<String> objectList = this.listRemoteFiles(bucket, url);
+        if(CollUtil.isEmpty(objectList)){
+            return 100;
+        }
+        List<String> restoreFileList = new ArrayList<>();
+        for (String objectName : objectList) {
+            objectMetadata = s3.getObjectMetadata(bucket, objectName);
+            if(this.isRestoreCompleted(objectMetadata)){
+
+                restoreFileList.add(objectName);
+            }
+        }
+        if(objectList.size() <= restoreFileList.size() ){
+            return 100;
+        }
+        BigDecimal rite = new BigDecimal(restoreFileList.size()).divide(new BigDecimal(objectList.size()),2,BigDecimal.ROUND_HALF_UP);
+        BigDecimal multiply = rite.multiply(new BigDecimal(100));
+        return multiply.intValue();
     }
 
     @Override
@@ -444,4 +470,52 @@ public class S3FileService extends AbstractFYunFileService {
 
         return total;
     }
+
+    @Override
+    public void copyFileToArchive(String sourceBucketName, String sourcePath, String targetBucketName, String targetPath) {
+        try {
+            List<String> files = listRemoteFiles(sourceBucketName, sourcePath);
+            if (ObjectUtils.isEmpty(files)) {
+                return;
+            }
+            files.stream().forEach(file -> {
+                CopyObjectRequest request = new CopyObjectRequest(sourceBucketName, file, targetBucketName, file.replace(sourcePath, targetPath));
+                request.setStorageClass(StorageClass.Glacier);
+                s3.copyObject(request);
+            });
+        } catch (Exception e) {
+            log.error("复制文件或目录失败,key:" + sourcePath, e);
+        }
+    }
+
+    public static void main(String[] args) {
+
+        AmazonS3 amazonS3 = amazonS3();
+
+        List<String> keyList = new ArrayList<>();
+        boolean flag = true;
+        String nextMaker = null;
+        ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
+        listObjectsRequest.setBucketName("test-4dkankan");
+        listObjectsRequest.setPrefix("test/KJ-t-ekRwoMX8XP");
+        listObjectsRequest.setMaxKeys(200);
+
+        do {
+            listObjectsRequest.setMarker(nextMaker);
+            ObjectListing objectListing = amazonS3.listObjects(listObjectsRequest);
+            List<S3ObjectSummary> objectSummaries = objectListing.getObjectSummaries();
+            List<String> collect = objectSummaries.stream().map(S3ObjectSummary::getKey).collect(Collectors.toList());
+            if (CollUtil.isNotEmpty(collect)) {
+                keyList.addAll(collect);
+            }
+            nextMaker = objectListing.getNextMarker();
+            flag = objectListing.isTruncated();
+        } while (flag);
+
+        keyList.stream().forEach(file -> {
+            CopyObjectRequest request = new CopyObjectRequest("test-4dkankan", file, "test-4dkk-bak", file.replace("test/KJ-t-ekRwoMX8XP", "test/KJ-t-ekRwoMX8XP"));
+            request.setStorageClass(StorageClass.DeepArchive);
+            amazonS3.copyObject(request);
+        });
+    }
 }