多线程批量上传OSS
一、OSS简介
阿里云存储服务(OpenStorageService,简称OSS),是阿里云对外提供的海量,安全,低成本,高可靠的云存储服务。
大家首先开通OSS,并且创建好Bucket,才能开始写代码使用它,参考博客:
二、单线程实现文件上传
这里创建三张图片,之后使用这三张图片进行上传操作
package com.example.oss;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.File;
import java.net.URL;
/**
* @Author 胡孟帆
* @Date 2021-11-19 9:12
* @Function
**/
@SpringBootTest
class OsssTests {
public static final String endpoint = "你的endpoint";
public static final String accessKeyId = "你的accessKeyId";
public static final String accessKeySecret = "你的accessKeySecret";
public static final String bucketName = "你的桶名";
public static OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
@Test
void contextLoads() {
}
public static void main(String[] args) throws InterruptedException {
//单线程插入
Long start = System.currentTimeMillis();
String[] urls = new String[3];
urls[0] = "E:/IDEABackground/wallhaven-j3dkjq.png";
urls[1] = "E:/IDEABackground/wallhaven-rd6req.png";
urls[2] = "E:/IDEABackground/wallhaven-rdpvmm.png";
Thread uploaderThread = null;
for (String url : urls) {
// String fileBaseName = url.substring(url.lastIndexOf("/") + 1);
try {
ossClient.putObject(bucketName, "fileBaseName.png", new File(url));
System.out.println(url + "上传图片完成!");
} catch (Exception e) {
System.out.println(url + "上传图片失败!");
e.printStackTrace();
}
}
Long end = System.currentTimeMillis();
Long time = end - start;
System.out.println("time = " + time);
ossClient.shutdown();
}
}
结果:
可以看到,单线程上传三张图片最后用时 1698ms。
三、实现Runnable接口
package com.example.oss;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.File;
import java.net.URL;
/**
* @Author 胡孟帆
* @Date 2021-11-19 9:27
* @Function
**/
@SpringBootTest
class OssApplicationTests {
public static final String endpoint = "你的endpoint";
public static final String accessKeyId = "你的accessKeyId";
public static final String accessKeySecret = "你的accessKeySecret";
public static final String bucketName = "你的桶名";
public static OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
@Test
void contextLoads() {
}
public static void main(String[] args) throws InterruptedException {
//多线程插入
Long start = System.currentTimeMillis();
System.out.println("start = " + start);
String[] urls = new String[3];
urls[0] = "E:/IDEABackground/wallhaven-j3dkjq.png";
urls[1] = "E:/IDEABackground/wallhaven-rd6req.png";
urls[2] = "E:/IDEABackground/wallhaven-rdpvmm.png";
Thread uploaderThread = null;
for (String url : urls) {
uploaderThread = new Thread(new Fileuploader(url,start));
uploaderThread.start();
}
Thread.sleep(5000);
ossClient.shutdown();
}
// 文件上传器
static class Fileuploader implements Runnable{
private final String fileURL;
private final Long start;
public Fileuploader(String fileURL,Long start) {
this.fileURL = fileURL;
this.start = start;
}
@Override
public void run() {
String fileBaseName = fileURL.substring(fileURL.lastIndexOf("/") + 1);
try {
ossClient.putObject(bucketName, fileBaseName, new File(fileURL));
System.out.println(fileURL + "上传图片完成!");
Long end = System.currentTimeMillis();
Long time = end - start;
System.out.println("time = " + time);
} catch (Exception e) {
System.out.println(fileURL + "上传图片失败!");
e.printStackTrace();
}
}
}
}
结果:
可以看到,实现Runnable上传三张图片最后用时 1079ms。
三、使用CompletableFuture实现异步编程
package com.example.oss;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.File;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
/**
* @Author 胡孟帆
* @Date 2021-11-19 10:36
* @Function
**/
@SpringBootTest
public class CompleteTableTests {
@Test
void contextLoads() {
}
public static final String endpoint = "你的endpoint";
public static final String accessKeyId = "你的accessKeyId";
public static final String accessKeySecret = "你的accessKeySecret";
public static final String bucketName = "你的桶名";
public static OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
public static void main(String[] args) {
//使用completableFuture多线程
Long start = System.currentTimeMillis();
String[] urls = new String[3];
urls[0] = "E:/IDEABackground/wallhaven-j3dkjq.png";
urls[1] = "E:/IDEABackground/wallhaven-rd6req.png";
urls[2] = "E:/IDEABackground/wallhaven-rdpvmm.png";
//异步无返回值
for (String url : urls) {
System.out.println("url = " + url);
CompletableFuture<Void> f1 = CompletableFuture.runAsync(()->{
System.out.println(start);
try {
System.out.println(start);
ossClient.putObject(bucketName, "fileBaseName.png", new File(url));
System.out.println(url + "上传图片完成!");
} catch (Exception e) {
System.out.println(url + "上传图片失败!");
e.printStackTrace();
}
// ossClient.shutdown();
});
f1.whenComplete((Long, throwable) -> {
Long end = System.currentTimeMillis();
Long time = end - start;
System.out.println("time = " + time);
});
}
try {
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果:
可以看到,实现Runnable上传三张图片最后用时 1041ms。
进入OSS控制台,可以看到图片已插入。