修改:HPC任务取消&删除优化

This commit is contained in:
2026-04-16 18:41:17 +08:00
parent 64869dda81
commit 09d4e3bd0d
3 changed files with 127 additions and 0 deletions

View File

@@ -6,5 +6,6 @@ import java.util.List;
@Data
public class DelHpcJobsReq {
private List<Long> ids;
private List<String> hpcJobIds;
}

View File

@@ -3,11 +3,13 @@ package com.sdm.pbs.controller;
import com.alibaba.fastjson2.JSONObject;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.common.ThreadLocalContext;
import com.sdm.common.entity.req.pbs.DelHpcJobsReq;
import com.sdm.common.entity.req.pbs.SubmitHpcTaskRemoteReq;
import com.sdm.common.feign.inter.pbs.ITaskFeignClient;
import com.sdm.common.utils.FilesUtil;
import com.sdm.pbs.config.PbsCommonConstant;
import com.sdm.pbs.model.bo.BatchWebSubmitResp;
import com.sdm.pbs.model.entity.HpcJobStatus;
import com.sdm.pbs.model.entity.SimulationJob;
import com.sdm.pbs.model.req.BatchHpcTaskReq;
import com.sdm.pbs.model.req.OneHpcTaskReq;
@@ -30,6 +32,7 @@ import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
@Slf4j
@RestController
@@ -117,6 +120,113 @@ public class TaskAdapter implements ITaskFeignClient {
return SdmResponse.success("提交成功");
}
@GetMapping("/stopHpcJobAdapter")
@Operation(summary = "作业停止-根据数据主键")
public SdmResponse<Boolean> stopHpcJob(@RequestParam Long id) {
if(Objects.isNull(id)) {
return SdmResponse.failed("id不能为空");
}
SimulationJob jobDb = simulationJobService.lambdaQuery().eq(SimulationJob::getId,id).one();
if(Objects.isNull(jobDb)) {
return SdmResponse.failed("数据不存在");
}
if(jobDb.getJobStatus().equals(HpcJobStatus.Canceled.name())||
jobDb.getJobStatus().equals(HpcJobStatus.Finished.name())||
jobDb.getJobStatus().equals(HpcJobStatus.Failed.name())) {
return SdmResponse.failed("任务状态为完成态,不能取消");
}
// 未入hpc节点的
if(StringUtils.isBlank(jobDb.getJobId())){
log.info("stopHpcJobAdapter 未入hpc节点的更新状态为已取消jobName:{}",jobDb.getJobName());
}else {
SdmResponse<Boolean> response = taskController.stopHpcJob(jobDb.getJobId());
if(!response.isSuccess()){
throw new RuntimeException("hpc作业取消失败");
}
log.info("stopHpcJobAdapter 已入hpc节点的更新状态为已取消jobName:{}",jobDb.getJobName());
}
jobDb.setJobStatus(HpcJobStatus.Canceled.name());
boolean b = simulationJobService.updateById(jobDb);
log.info("stopHpcJobAdapter 更新状态为已取消jobName:{}b:{}",jobDb.getJobName(),b);
return SdmResponse.success(b);
}
@PostMapping("/delHpcJobsAdapter")
@Operation(summary = "批量删除Hpc任务")
public SdmResponse delHpcJobsAdapter(@RequestBody DelHpcJobsReq req) {
// 1. 入参校验
if (CollectionUtils.isEmpty(req.getIds())) {
return SdmResponse.failed("删除数据id不能为空");
}
// 2. 查询任务列表
List<SimulationJob> jobList = simulationJobService.lambdaQuery()
.select(SimulationJob::getId, SimulationJob::getJobId, SimulationJob::getJobStatus)
.in(SimulationJob::getId, req.getIds())
.list();
if (CollectionUtils.isEmpty(jobList)) {
return SdmResponse.failed("未查询到对应任务数据");
}
for (SimulationJob job : jobList) {
if(!HpcJobStatus.getFinishedStatusNames().contains(job.getJobStatus())) {
throw new RuntimeException("数据任务状态非完成态,不能删除");
}
}
// 3. 分组空jobId / 有效jobId
List<Long> emptyJobIds = filterEmptyJobIds(jobList);
List<String> validJobIds = filterValidJobIds(jobList);
// 4. 处理本地标记删除
updateDelFlagForEmptyJobs(emptyJobIds);
// 5. 有有效ID则调用HPC删除
if (CollectionUtils.isNotEmpty(validJobIds)) {
DelHpcJobsReq delHpcJobsReq = new DelHpcJobsReq();
delHpcJobsReq.setHpcJobIds(validJobIds);
return taskController.delHpcJobs(delHpcJobsReq);
}
return SdmResponse.success("批量删除HPC任务成功");
}
/**
* 筛选出 jobId 为空的 主键ID
*/
private List<Long> filterEmptyJobIds(List<SimulationJob> jobList) {
return jobList.stream()
.filter(job -> StringUtils.isBlank(job.getJobId()))
.map(SimulationJob::getId)
.collect(Collectors.toList());
}
/**
* 筛选出 jobId 不为空的 有效HPC任务ID
*/
private List<String> filterValidJobIds(List<SimulationJob> jobList) {
return jobList.stream()
.filter(job -> StringUtils.isNotBlank(job.getJobId()))
.map(SimulationJob::getJobId)
.collect(Collectors.toList());
}
/**
* 批量更新 delFlag = Y
*/
private void updateDelFlagForEmptyJobs(List<Long> emptyJobIds) {
if (CollectionUtils.isEmpty(emptyJobIds)) {
return;
}
boolean updateSuccess = simulationJobService.lambdaUpdate()
.in(SimulationJob::getId, emptyJobIds)
.set(SimulationJob::getDelFlag, "Y")
.update();
log.info("[HPC任务删除] 本地标记删除成功,数量:{},结果:{}", emptyJobIds.size(), updateSuccess);
}
private void getSimulationFile(SubmitHpcTaskRemoteReq req,SubmitHpcTaskReq submitHpcTaskReq,String batchFilePath ) {
log.info("提交请求参数:{}", JSONObject.toJSONString(req));
String masterFilepath="";

View File

@@ -2,6 +2,8 @@ package com.sdm.pbs.model.entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.List;
@Getter
@AllArgsConstructor
public enum HpcJobStatus {
@@ -16,4 +18,18 @@ public enum HpcJobStatus {
Failed("任务失败");
private final String desc;
/**
* 获取所有完成态的枚举名称name集合
* 完成态:已取消、已完成、任务失败
*/
public static List<String> getFinishedStatusNames() {
return List.of(
Canceled.name(),
Finished.name(),
Failed.name()
);
}
}