|
@@ -39,6 +39,10 @@ import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
import java.util.Objects;
|
|
import java.util.Objects;
|
|
import java.util.Set;
|
|
import java.util.Set;
|
|
|
|
+import java.util.concurrent.Callable;
|
|
|
|
+import java.util.concurrent.ExecutorService;
|
|
|
|
+import java.util.concurrent.Executors;
|
|
|
|
+import java.util.concurrent.atomic.AtomicInteger;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.var;
|
|
import lombok.var;
|
|
@@ -166,7 +170,7 @@ public class SceneDownloadHandlerServiceImpl {
|
|
// String v3localPath = "F:\\downloads\\v3local\\";
|
|
// String v3localPath = "F:\\downloads\\v3local\\";
|
|
|
|
|
|
try {
|
|
try {
|
|
- Set<String> cacheKeys = new HashSet<>();
|
|
|
|
|
|
+ Set<String> cacheKeys = new ConcurrentHashSet<>();
|
|
|
|
|
|
Map<String, List<String>> allFiles = this.getAllFiles(num, v3localPath);
|
|
Map<String, List<String>> allFiles = this.getAllFiles(num, v3localPath);
|
|
List<String> ossFilePaths = allFiles.get("ossFilePaths");
|
|
List<String> ossFilePaths = allFiles.get("ossFilePaths");
|
|
@@ -174,7 +178,7 @@ public class SceneDownloadHandlerServiceImpl {
|
|
|
|
|
|
//key总个数
|
|
//key总个数
|
|
int total = ossFilePaths.size() + v3localFilePaths.size();
|
|
int total = ossFilePaths.size() + v3localFilePaths.size();
|
|
- int count = 0;
|
|
|
|
|
|
+ AtomicInteger count = new AtomicInteger(0);
|
|
//定义压缩包
|
|
//定义压缩包
|
|
// zipPath = "/downloads/scenes/" + num + ".zip";
|
|
// zipPath = "/downloads/scenes/" + num + ".zip";
|
|
// zipPath = "F:\\downloads\\scenes\\" + num + ".zip";
|
|
// zipPath = "F:\\downloads\\scenes\\" + num + ".zip";
|
|
@@ -203,12 +207,12 @@ public class SceneDownloadHandlerServiceImpl {
|
|
|
|
|
|
long start = Calendar.getInstance().getTimeInMillis();
|
|
long start = Calendar.getInstance().getTimeInMillis();
|
|
//固定文件写入
|
|
//固定文件写入
|
|
- count = this.zipLocalFiles(out, v3localFilePaths, v3localPath, num, count, total);
|
|
|
|
|
|
+ this.zipLocalFiles(out, v3localFilePaths, v3localPath, num, count, total);
|
|
long end1 = Calendar.getInstance().getTimeInMillis();
|
|
long end1 = Calendar.getInstance().getTimeInMillis();
|
|
log.info("打包固定文件耗时:{}", end1 - start);
|
|
log.info("打包固定文件耗时:{}", end1 - start);
|
|
|
|
|
|
//oss文件写入
|
|
//oss文件写入
|
|
- count = this.zipOssFiles(out, ossFilePaths, num, count, total, resolution, imagesVersion, cacheKeys);
|
|
|
|
|
|
+ this.zipOssFiles(out, ossFilePaths, num, count, total, resolution, imagesVersion, cacheKeys);
|
|
long end2 = Calendar.getInstance().getTimeInMillis();
|
|
long end2 = Calendar.getInstance().getTimeInMillis();
|
|
log.info("打包oss文件耗时:{}", end2 - end1);
|
|
log.info("打包oss文件耗时:{}", end2 - end1);
|
|
|
|
|
|
@@ -250,30 +254,40 @@ public class SceneDownloadHandlerServiceImpl {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- private int zipOssFiles(ZipOutputStream out, List<String> ossFilePaths, String num, int count, int total, String resolution, int imagesVersion, Set<String> cacheKeys) throws Exception{
|
|
|
|
|
|
+ private void zipOssFiles(ZipOutputStream out, List<String> ossFilePaths, String num, AtomicInteger count, int total, String resolution, int imagesVersion, Set<String> cacheKeys) throws Exception{
|
|
String imageNumPath = String.format(UploadFilePath.IMG_VIEW_PATH, num);
|
|
String imageNumPath = String.format(UploadFilePath.IMG_VIEW_PATH, num);
|
|
|
|
+ ExecutorService executorService = Executors.newFixedThreadPool(10);
|
|
for (String filePath : ossFilePaths) {
|
|
for (String filePath : ossFilePaths) {
|
|
if(filePath.contains(imageNumPath + "panorama/panorama_edit/")){
|
|
if(filePath.contains(imageNumPath + "panorama/panorama_edit/")){
|
|
//如果是编辑目录,只需要更新进度,不需要放进压缩包
|
|
//如果是编辑目录,只需要更新进度,不需要放进压缩包
|
|
- this.updateProgress(new BigDecimal(++count).divide(new BigDecimal(total), 6, BigDecimal.ROUND_HALF_UP),
|
|
|
|
|
|
+ this.updateProgress(new BigDecimal(count.incrementAndGet()).divide(new BigDecimal(total), 6, BigDecimal.ROUND_HALF_UP),
|
|
num, SceneDownloadProgressStatus.DOWNLOADING.code(), null);
|
|
num, SceneDownloadProgressStatus.DOWNLOADING.code(), null);
|
|
- continue;
|
|
|
|
}else if((filePath.contains(imageNumPath + "panorama/") && filePath.contains("tiles/" + resolution)) || filePath.contains(imageNumPath + "tiles/" + resolution + "/")) {
|
|
}else if((filePath.contains(imageNumPath + "panorama/") && filePath.contains("tiles/" + resolution)) || filePath.contains(imageNumPath + "tiles/" + resolution + "/")) {
|
|
- this.processImage(filePath, out, resolution, imagesVersion, cacheKeys);
|
|
|
|
|
|
+ Callable<Boolean> call = new Callable() {
|
|
|
|
+ @Override
|
|
|
|
+ public Boolean call() throws Exception {
|
|
|
|
+ processImage(filePath, out, resolution, imagesVersion, cacheKeys);
|
|
|
|
+ //更新进度
|
|
|
|
+ updateProgress(new BigDecimal(count.incrementAndGet()).divide(new BigDecimal(total), 6, BigDecimal.ROUND_HALF_UP),
|
|
|
|
+ num, SceneDownloadProgressStatus.DOWNLOAD_COMPRESSING.code(), null);
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ executorService.submit(call);
|
|
}else{
|
|
}else{
|
|
long start = Calendar.getInstance().getTimeInMillis();
|
|
long start = Calendar.getInstance().getTimeInMillis();
|
|
this.ProcessFiles(filePath, out, this.wwwroot, cacheKeys);
|
|
this.ProcessFiles(filePath, out, this.wwwroot, cacheKeys);
|
|
log.info("非切图文件耗时,key:{},time:{}", filePath, Calendar.getInstance().getTimeInMillis() - start);
|
|
log.info("非切图文件耗时,key:{},time:{}", filePath, Calendar.getInstance().getTimeInMillis() - start);
|
|
|
|
+ //更新进度
|
|
|
|
+ this.updateProgress(new BigDecimal(count.incrementAndGet()).divide(new BigDecimal(total), 6, BigDecimal.ROUND_HALF_UP),
|
|
|
|
+ num, SceneDownloadProgressStatus.DOWNLOAD_COMPRESSING.code(), null);
|
|
}
|
|
}
|
|
|
|
|
|
- //更新进度
|
|
|
|
- this.updateProgress(new BigDecimal(++count).divide(new BigDecimal(total), 6, BigDecimal.ROUND_HALF_UP),
|
|
|
|
- num, SceneDownloadProgressStatus.DOWNLOAD_COMPRESSING.code(), null);
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
- return count;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- private int zipLocalFiles(ZipOutputStream out, List<String> v3localFilePaths, String v3localPath, String num, int count, int total) throws Exception{
|
|
|
|
|
|
+ private void zipLocalFiles(ZipOutputStream out, List<String> v3localFilePaths, String v3localPath, String num, AtomicInteger count, int total) throws Exception{
|
|
for (String v3localFilePath : v3localFilePaths) {
|
|
for (String v3localFilePath : v3localFilePaths) {
|
|
try (FileInputStream in = new FileInputStream(new File(v3localFilePath));){
|
|
try (FileInputStream in = new FileInputStream(new File(v3localFilePath));){
|
|
this.zipInputStream(out, v3localFilePath.replace(v3localPath, ""), in);
|
|
this.zipInputStream(out, v3localFilePath.replace(v3localPath, ""), in);
|
|
@@ -282,12 +296,11 @@ public class SceneDownloadHandlerServiceImpl {
|
|
}
|
|
}
|
|
//更新进度
|
|
//更新进度
|
|
this.updateProgress(
|
|
this.updateProgress(
|
|
- new BigDecimal(++count).divide(new BigDecimal(total), 6, BigDecimal.ROUND_HALF_UP),
|
|
|
|
|
|
+ new BigDecimal(count.incrementAndGet()).divide(new BigDecimal(total), 6, BigDecimal.ROUND_HALF_UP),
|
|
num, SceneDownloadProgressStatus.DOWNLOAD_COMPRESSING.code(), null);
|
|
num, SceneDownloadProgressStatus.DOWNLOAD_COMPRESSING.code(), null);
|
|
}
|
|
}
|
|
//写入code.txt
|
|
//写入code.txt
|
|
this.zipBytes(out, "code.txt", num.getBytes());
|
|
this.zipBytes(out, "code.txt", num.getBytes());
|
|
- return count;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
private void zipBat(ZipOutputStream out, String num) throws Exception{
|
|
private void zipBat(ZipOutputStream out, String num) throws Exception{
|