Application.java 4.29 KB
package com.vion;


import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.ListObjectsRequest;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import com.vion.entity.OssClientEntity;
import com.vion.utils.OssFileUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.concurrent.DefaultManagedAwareThreadFactory;

import javax.annotation.Resource;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


@ComponentScan(value = "com.vion")
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@Slf4j
public class Application implements CommandLineRunner {

    public static final String PICTURE = "picture/";
    public static final String FEATURE = "feature/";
    public static final String POSTFIX = ".feature";


    public static void main(String[] args) {
        try {
            SpringApplication.run(Application.class, args);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    @Resource
    private OssClientEntity ossClientEntity;
    @Value("${prefix}")
    private String prefix;
    @Value(("${serialnumStr:}"))
    private String serialnumStr;
    @Value("${file_path:}")
    private String filePath;


    @Override
    public void run(String... args) throws Exception {

        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(50, 100, 10, TimeUnit.MINUTES, new LinkedBlockingQueue<>(),new  DefaultManagedAwareThreadFactory());

        if (!"".equals(filePath)) {
            try {
                File file = new File("d:\\" + filePath.replace("\\", "/"));
                ossClientEntity.getOssClient().getObject(new GetObjectRequest(ossClientEntity.getBucket(), filePath), file);
            } catch (Exception e) {
                System.exit(0);
            }
            System.exit(0);
        }


        List<String> filePathList = new ArrayList<>();
        if (!serialnumStr.isEmpty()) {
            String[] serialnums = serialnumStr.split(",");
            for (String serialnum : serialnums) {
                filePathList.add(prefix + serialnum + "/");
            }
        } else {
            filePathList.add(prefix);
        }


        for (String filePath : filePathList) {


        /*下载文件*/
            OssFileUtil ossFileUtil = new OssFileUtil();
            ObjectListing objectListing = null;
            do {
                ListObjectsRequest request = ossFileUtil.getFilesInPrefix(ossClientEntity.getBucket(), filePath, ossClientEntity.getOssClient(), 500, false);
                if (objectListing != null) {
                    request.setMarker(objectListing.getNextMarker());
                }

                objectListing = ossClientEntity.getOssClient().listObjects(request);

                objectListing.getObjectSummaries().forEach(summery -> threadPool.execute(() -> {download(summery);})
                );
            } while (objectListing.isTruncated());

        }
    }

    private void download(OSSObjectSummary summery) {
        try {
            File f = new File("D:\\" + summery.getKey().replace("\\", "/"));
            if (!f.getParentFile().exists()) {
                synchronized (this) {
                    if (!f.getParentFile().exists()) {
                        f.getParentFile().mkdirs();
                    }
                }
            }
            if (!f.exists()) {
                System.out.println("正在下载" + summery.getKey());
                ossClientEntity.getOssClient().getObject(new GetObjectRequest(ossClientEntity.getBucket(), summery.getKey()), f);

            } else {
                System.out.println(summery.getKey() + "已存在,跳过-------------");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}