超算打包下载接口联调
This commit is contained in:
parent
d00c415387
commit
67bf49ea5c
|
|
@ -1,6 +1,7 @@
|
|||
package com.ruoyi.platform.scheduling;
|
||||
|
||||
import cn.hutool.core.lang.UUID;
|
||||
import cn.hutool.core.map.MapUtil;
|
||||
import cn.hutool.json.JSONArray;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
|
|
@ -18,6 +19,7 @@ import org.springframework.stereotype.Component;
|
|||
import javax.annotation.Resource;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
|
@ -186,21 +188,36 @@ public class AppScheduleTask {
|
|||
JSONArray fileList = csCollectService.queryTaskResult(taskId);
|
||||
JSONObject taskResult = new JSONObject();
|
||||
JSONArray filePaths = new JSONArray();
|
||||
JSONObject taskInfo = JSONUtil.parseObj(trainingTask.getTaskInfo());
|
||||
String savePath = "/mini-model-platform-data/cs-data/" +trainingTask.getServiceId() + "/" + UUID.fastUUID();
|
||||
String saveFilePath = savePath + "/file/";
|
||||
fileList.forEach(file -> {
|
||||
JSONObject fileObj = JSONUtil.parseObj(file);
|
||||
Integer objectId = (Integer) fileObj.get("objectID");
|
||||
String fileName = (String) fileObj.get("path");
|
||||
try {
|
||||
JSONObject filePath = csCollectService.singleFileDownload(objectId, savePath,fileName );
|
||||
JSONObject filePath = csCollectService.singleFileDownload(objectId, saveFilePath,fileName );
|
||||
filePaths.set(filePath);
|
||||
} catch (Exception e) {
|
||||
log.error("checkCSAppTaskResult error={}",e.getMessage());
|
||||
}
|
||||
});
|
||||
|
||||
String zipFileName = "batch_download_" + taskId + ".zip";
|
||||
String zipFilePath = savePath + "/" + zipFileName;
|
||||
HashMap<String, String> upload = MapUtil.newHashMap();
|
||||
upload.put("input", (String) taskInfo.getByPath("input_file.direct_url"));
|
||||
upload.put("output", saveFilePath);
|
||||
csCollectService.allFileUpload(upload, savePath + "/" + zipFileName);
|
||||
HashMap<String, String> batch_download = MapUtil.newHashMap();
|
||||
batch_download.put("direct_url", zipFilePath);
|
||||
batch_download.put("filename", zipFileName);
|
||||
|
||||
taskResult.set("files", filePaths);
|
||||
taskResult.set("result_path", savePath);
|
||||
taskResult.set("task_id", taskId);
|
||||
taskResult.set("task_id", taskId);
|
||||
taskResult.set("batch_download", batch_download);
|
||||
trainingTask.setStatus(Constant.Succeeded);
|
||||
trainingTask.setTaskResult(taskResult.toString());
|
||||
trainingTaskDao.update(trainingTask);
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@ import cn.hutool.json.JSONArray;
|
|||
import cn.hutool.json.JSONObject;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
public interface CSCollectService {
|
||||
|
||||
JSONArray getHpcAppCluster(String appCode) throws Exception;
|
||||
|
|
@ -19,4 +21,6 @@ public interface CSCollectService {
|
|||
JSONArray queryTaskResult(String taskId) throws Exception;
|
||||
|
||||
JSONObject singleFileDownload(Integer objectId, String savePath,String fileName) throws Exception;
|
||||
|
||||
void allFileUpload(HashMap<String, String> upload, String zipFilePath) throws Exception;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ import javax.annotation.Resource;
|
|||
import java.io.*;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@Service
|
||||
|
|
@ -300,29 +301,40 @@ public class CSCollectServiceImpl implements CSCollectService {
|
|||
CloseableHttpResponse response = HttpUtils.sendGetReturnResponse(presignUrl, csAuthInfo.getToken());
|
||||
InputStream content = response.getEntity().getContent();
|
||||
//存入minio
|
||||
return fileSaveToMinIO(content, savePath,fileName);
|
||||
return fileSaveToMinIO(content, savePath, fileName);
|
||||
}
|
||||
|
||||
/**
|
||||
* 所有文件打包下载
|
||||
* 所有文件打包上传
|
||||
*
|
||||
* @param packageId
|
||||
* @param userId
|
||||
* @param token
|
||||
* @param upload
|
||||
* @param zipFilePath
|
||||
* @throws Exception
|
||||
*/
|
||||
private void allFileDownload(String packageId, String userId, String token) throws Exception {
|
||||
String url = csUrl + "/jsm/v2/storage/presign";
|
||||
String paramStr = "{\"userID\":137,\"info\":{\"type\":\"batchDownload\",\"params\":{\"packageID\":13627,\"zip\":true}}}";
|
||||
JSONObject params = JSONUtil.parseObj(paramStr);
|
||||
params.set("userID", userId);
|
||||
params.putByPath("info.params.packageID", packageId);
|
||||
String res = HttpUtils.sendBodyPostWithToken(url, params, token);
|
||||
@Override
|
||||
public void allFileUpload(HashMap<String, String> upload, String zipFilePath) throws Exception {
|
||||
// 异步提交任务
|
||||
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
|
||||
try {
|
||||
minioUtil.createZipFromDirectory(bucketName, upload, zipFilePath);
|
||||
return "执行成功";
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("异步提交任务失败", e);
|
||||
}
|
||||
});
|
||||
// 处理异步结果
|
||||
future.thenAcceptAsync(result -> {
|
||||
|
||||
log.info("所有文件打包上传成功,result: {}", result);
|
||||
}).exceptionally(ex -> {
|
||||
log.error("异步处理任务失败", ex);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
//将内容同步到minio中
|
||||
private JSONObject fileSaveToMinIO(InputStream inputStream, String savePath,String fileName) throws Exception {
|
||||
String path = savePath+"/" +fileName;
|
||||
private JSONObject fileSaveToMinIO(InputStream inputStream, String savePath, String fileName) throws Exception {
|
||||
String path = savePath + "/" + fileName;
|
||||
ByteArrayInputStream byteArrayOutputStream = readAllBytes(inputStream);
|
||||
minioUtil.uploadObject(bucketName, path, byteArrayOutputStream);
|
||||
|
||||
|
|
@ -380,7 +392,7 @@ public class CSCollectServiceImpl implements CSCollectService {
|
|||
if (csAuthInfo == null) {
|
||||
return;
|
||||
}
|
||||
redisService.setCacheObject(TOKEN_KEY, BeanUtil.beanToMap(csAuthInfo),10L, TimeUnit.MINUTES);
|
||||
redisService.setCacheObject(TOKEN_KEY, BeanUtil.beanToMap(csAuthInfo), 10L, TimeUnit.MINUTES);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -512,4 +512,106 @@ public class MinioUtil {
|
|||
return new ByteArrayInputStream(zipOutputStream.toByteArray());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建目录的压缩包
|
||||
*/
|
||||
public void createZipFromDirectory(String bucket, Map<String,String> dirMap, String zipPath)
|
||||
throws Exception {
|
||||
|
||||
// 创建内存中的ZIP流
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
|
||||
try (ZipOutputStream zos = new ZipOutputStream(baos)) {
|
||||
|
||||
// 遍历每个目录映射
|
||||
for (Map.Entry<String, String> entry : dirMap.entrySet()) {
|
||||
String folderName = entry.getKey(); // 压缩包内的文件夹名
|
||||
String sourcePath = entry.getValue(); // MinIO中的路径
|
||||
|
||||
// 1. 自动提取目录路径(去除文件名)
|
||||
String sourceDir = extractDirectoryPath(sourcePath);
|
||||
|
||||
// 2. 规范化文件夹名
|
||||
if (!folderName.endsWith("/")) {
|
||||
folderName = folderName + "/";
|
||||
}
|
||||
|
||||
// 3. 获取目录下的所有文件
|
||||
Iterable<Result<Item>> items = minioClient.listObjects(
|
||||
ListObjectsArgs.builder()
|
||||
.bucket(bucket)
|
||||
.prefix(sourceDir)
|
||||
.recursive(true)
|
||||
.build()
|
||||
);
|
||||
|
||||
// 4. 添加文件到ZIP
|
||||
for (Result<Item> result : items) {
|
||||
Item item = result.get();
|
||||
if (item.isDir()) continue;
|
||||
|
||||
String objectName = item.objectName();
|
||||
String relativePath = objectName.substring(sourceDir.length());
|
||||
|
||||
// 使用自定义的文件夹名
|
||||
String zipEntryName = folderName + relativePath;
|
||||
|
||||
// ZIP条目
|
||||
zos.putNextEntry(new ZipEntry(zipEntryName));
|
||||
|
||||
try (InputStream is = minioClient.getObject(
|
||||
GetObjectArgs.builder()
|
||||
.bucket(bucket)
|
||||
.object(objectName)
|
||||
.build())) {
|
||||
|
||||
// 使用缓冲区读写
|
||||
byte[] buffer = new byte[8192];
|
||||
int bytesRead;
|
||||
while ((bytesRead = is.read(buffer)) != -1) {
|
||||
zos.write(buffer, 0, bytesRead);
|
||||
}
|
||||
}
|
||||
|
||||
zos.closeEntry();
|
||||
}
|
||||
}
|
||||
|
||||
zos.finish();
|
||||
}
|
||||
|
||||
// 上传压缩包到MinIO
|
||||
byte[] zipBytes = baos.toByteArray();
|
||||
|
||||
try (ByteArrayInputStream bais = new ByteArrayInputStream(zipBytes)) {
|
||||
minioClient.putObject(
|
||||
PutObjectArgs.builder()
|
||||
.bucket(bucket)
|
||||
.object(zipPath)
|
||||
.stream(bais, zipBytes.length, -1)
|
||||
.contentType("application/zip")
|
||||
.build()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private String extractDirectoryPath(String path) {
|
||||
path = path.trim();
|
||||
|
||||
// 如果路径包含点号且不以斜杠结尾,可能是文件
|
||||
if (path.contains(".") && !path.endsWith("/")) {
|
||||
int lastSlash = path.lastIndexOf("/");
|
||||
if (lastSlash > 0) {
|
||||
// 返回目录部分
|
||||
return path.substring(0, lastSlash + 1);
|
||||
}
|
||||
}
|
||||
|
||||
// 如果不是文件路径,直接返回
|
||||
if (!path.endsWith("/")) {
|
||||
return path + "/";
|
||||
}
|
||||
return path;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue