🔨 批量上传.

This commit is contained in:
lijiahang
2024-05-10 18:58:48 +08:00
parent 564e40a31d
commit 0a43e5db45
18 changed files with 557 additions and 135 deletions

View File

@@ -40,7 +40,7 @@ import java.util.List;
@SuppressWarnings({"ELValidationInJSP", "SpringElInspection"})
public class UploadTaskController {
// TODO 测试空文件上传 0B 取消怎么那么慢 是不是删除也慢 异步cancel cancel 需要设置子元素为 cancel
// TODO 前端日志 测试删除慢吗
@Resource
private UploadTaskService uploadTaskService;

View File

@@ -7,7 +7,6 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 上传任务 视图响应对象
@@ -31,7 +30,4 @@ public class UploadTaskCreateVO implements Serializable {
@Schema(description = "上传 token")
private String token;
@Schema(description = "主机")
private List<HostBaseVO> hosts;
}

View File

@@ -43,6 +43,9 @@ public class UploadTaskFileVO implements Serializable {
@Schema(description = "文件大小")
private Long fileSize;
@Schema(description = "额外信息")
private String extraInfo;
@Schema(description = "状态")
private String status;

View File

@@ -0,0 +1,43 @@
package com.orion.ops.module.asset.entity.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
/**
* 上传任务主机 视图响应对象
*
* @author Jiahang Li
* @version 1.0.7
* @since 2024-5-8 10:31
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "UploadTaskHostVO", description = "上传任务主机 视图响应对象")
public class UploadTaskHostVO implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "id")
private Long id;
@Schema(description = "主机名称")
private String name;
@Schema(description = "主机编码")
private String code;
@Schema(description = "主机地址")
private String address;
@Schema(description = "上传文件")
private List<UploadTaskFileVO> files;
}

View File

@@ -56,7 +56,7 @@ public class UploadTaskVO implements Serializable {
@Schema(description = "创建时间")
private Date createTime;
@Schema(description = "上传文件")
private List<UploadTaskFileVO> files;
@Schema(description = "上传主机及文件")
private List<UploadTaskHostVO> hosts;
}

View File

@@ -128,7 +128,6 @@ public class SftpSession extends TerminalSession implements ISftpSession {
} catch (Exception e) {
throw Exceptions.ioRuntime(e);
} finally {
// TODO Test
// 关闭 inputStream 可能会被阻塞 ???...??? 只能关闭 executor
Streams.close(this.executor);
this.connect();

View File

@@ -141,6 +141,9 @@ public class FileUploadTask implements IFileUploadTask {
.current(0L)
.build())
.collect(Collectors.toList());
if (files.isEmpty()) {
return;
}
// 添加到上传器
uploaderList.add(new FileUploader(id, k, files));
});
@@ -150,6 +153,10 @@ public class FileUploadTask implements IFileUploadTask {
* 执行上传
*/
private void runUpload() throws Exception {
if (uploaderList.isEmpty()) {
return;
}
// 执行
if (uploaderList.size() == 1) {
// 单个主机直接执行
IFileUploader handler = uploaderList.get(0);

View File

@@ -141,7 +141,6 @@ public class FileUploader implements IFileUploader {
int read;
while ((read = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, read);
// todo test
file.setCurrent(file.getCurrent() + read);
}
outputStream.flush();

View File

@@ -32,10 +32,7 @@ import com.orion.ops.module.asset.entity.request.upload.UploadTaskCreateRequest;
import com.orion.ops.module.asset.entity.request.upload.UploadTaskFileRequest;
import com.orion.ops.module.asset.entity.request.upload.UploadTaskQueryRequest;
import com.orion.ops.module.asset.entity.request.upload.UploadTaskRequest;
import com.orion.ops.module.asset.entity.vo.HostBaseVO;
import com.orion.ops.module.asset.entity.vo.UploadTaskCreateVO;
import com.orion.ops.module.asset.entity.vo.UploadTaskFileVO;
import com.orion.ops.module.asset.entity.vo.UploadTaskVO;
import com.orion.ops.module.asset.entity.vo.*;
import com.orion.ops.module.asset.enums.HostConfigTypeEnum;
import com.orion.ops.module.asset.enums.UploadTaskFileStatusEnum;
import com.orion.ops.module.asset.enums.UploadTaskStatusEnum;
@@ -147,7 +144,6 @@ public class UploadTaskServiceImpl implements UploadTaskService {
return UploadTaskCreateVO.builder()
.id(id)
.token(token)
.hosts(hosts)
.build();
}
@@ -158,11 +154,12 @@ public class UploadTaskServiceImpl implements UploadTaskService {
Valid.notNull(record, ErrorMessage.DATA_ABSENT);
// 查询任务文件
List<UploadTaskFileVO> files = uploadTaskFileService.getFileByTaskId(id);
// 计算传输进度
this.computeUploadProgress(id, files);
// 返回
UploadTaskVO uploadTask = UploadTaskConvert.MAPPER.to(record);
uploadTask.setFiles(files);
// 计算传输进度
this.computeUploadProgress(id, files);
// 设置任务文件
this.setTaskFiles(uploadTask, files);
return uploadTask;
}
@@ -208,8 +205,9 @@ public class UploadTaskServiceImpl implements UploadTaskService {
} else {
// 计算进度
this.computeUploadProgress(id, files);
// 设置任务文件
}
task.setFiles(files);
this.setTaskFiles(task, files);
}
return tasks;
}
@@ -299,8 +297,6 @@ public class UploadTaskServiceImpl implements UploadTaskService {
.map(localFileClient::getReturnPath)
.map(localFileClient::getAbsolutePath)
.collect(Collectors.toList());
// TODO test
paths.forEach(System.out::println);
// 删除文件
paths.forEach(Files1::delete);
}
@@ -393,7 +389,7 @@ public class UploadTaskServiceImpl implements UploadTaskService {
uploadFile.setStatus(UploadTaskFileStatusEnum.CANCELED.name());
uploadFile.setEndTime(new Date());
LambdaQueryWrapper<UploadTaskFileDO> updateFileQuery = uploadTaskFileDAO.wrapper()
.in(UploadTaskFileDO::getId, updateIdList)
.in(UploadTaskFileDO::getTaskId, updateIdList)
.in(UploadTaskFileDO::getStatus,
UploadTaskFileStatusEnum.WAITING.name(),
UploadTaskFileStatusEnum.UPLOADING.name());
@@ -446,11 +442,34 @@ public class UploadTaskServiceImpl implements UploadTaskService {
} else if (UploadTaskFileStatusEnum.FINISHED.name().equals(status)) {
file.setCurrent(file.getFileSize());
} else if (UploadTaskFileStatusEnum.FAILED.name().equals(status)) {
file.setCurrent(0L);
file.setCurrent(file.getFileSize());
} else if (UploadTaskFileStatusEnum.CANCELED.name().equals(status)) {
file.setCurrent(0L);
file.setCurrent(file.getFileSize());
}
}
}
/**
* 设置任务文件
*
* @param task task
* @param files files
*/
private void setTaskFiles(UploadTaskVO task, List<UploadTaskFileVO> files) {
Map<Long, List<UploadTaskFileVO>> hostFiles = files.stream()
.collect(Collectors.groupingBy(UploadTaskFileVO::getHostId));
List<UploadTaskHostVO> hosts = JSON.parseObject(task.getExtraInfo(), UploadTaskExtraDTO.class)
.getHosts()
.stream()
.map(s -> UploadTaskHostVO.builder()
.id(s.getId())
.code(s.getCode())
.name(s.getName())
.address(s.getAddress())
.files(hostFiles.get(s.getId()))
.build())
.collect(Collectors.toList());
task.setHosts(hosts);
}
}