From cf1d83a0a2dcd091933da254b95d80ee1fd583c4 Mon Sep 17 00:00:00 2001 From: gaoxq <376340421@qq.com> Date: Mon, 25 Aug 2025 23:23:36 +0800 Subject: [PATCH] =?UTF-8?q?API=E6=95=B0=E6=8D=AE=E8=A1=A8=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{taskHostDisk.java => taskEnable.java} | 7 +- .../capi/sys/controller/sysController.java | 105 +++++++++++------- 2 files changed, 69 insertions(+), 43 deletions(-) rename src/main/java/com/mini/capi/job/{taskHostDisk.java => taskEnable.java} (96%) diff --git a/src/main/java/com/mini/capi/job/taskHostDisk.java b/src/main/java/com/mini/capi/job/taskEnable.java similarity index 96% rename from src/main/java/com/mini/capi/job/taskHostDisk.java rename to src/main/java/com/mini/capi/job/taskEnable.java index e391891..c4b69c7 100644 --- a/src/main/java/com/mini/capi/job/taskHostDisk.java +++ b/src/main/java/com/mini/capi/job/taskEnable.java @@ -4,10 +4,7 @@ package com.mini.capi.job; import com.mini.capi.biz.domain.*; import com.mini.capi.biz.service.*; import com.mini.capi.model.ApiResult; -import com.mini.capi.utils.HostInfo; -import com.mini.capi.utils.vDate; -import com.mini.capi.utils.vId; -import com.mini.capi.utils.vToken; +import com.mini.capi.utils.*; import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -21,7 +18,7 @@ import java.util.stream.Collectors; @RestController @RequestMapping("/Sys/jobs") -public class taskHostDisk { +public class taskEnable { @Resource diff --git a/src/main/java/com/mini/capi/sys/controller/sysController.java b/src/main/java/com/mini/capi/sys/controller/sysController.java index 219be51..cbe6d55 100644 --- a/src/main/java/com/mini/capi/sys/controller/sysController.java +++ b/src/main/java/com/mini/capi/sys/controller/sysController.java @@ -14,6 +14,7 @@ import com.mini.capi.utils.docker; import com.mini.capi.utils.vDate; import com.mini.capi.utils.vToken; import jakarta.annotation.Resource; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -22,6 +23,8 @@ import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; import java.util.stream.Collectors; @RestController @@ -41,6 +44,10 @@ public class sysController { private DockerContainerInfoService dockerInfoService; + @Resource + private Executor hostExecutor; + + public static class SnapshotDTO { public String hostName; public String timestamp; @@ -199,6 +206,54 @@ public class sysController { } + private void handleSingleDockerHost(DockerHost host, List errorList) { + try { + /* 1. 一次性加载现有数据 */ + List oldList = + dockerInfoService.lambdaQuery() + .eq(DockerContainerInfo::getDokerHostId, host.getDokerHostId()) + .list(); + + Map oldMap = oldList.stream() + .collect(Collectors.toMap( + c -> buildKey(c.getDokerHostId(), c.getImageName(), c.getUnames()), + c -> c)); + + /* 2. 远程最新数据 */ + SshUser sshUser = sshUserService.getById(host.getUserId()); + SshInfo sshInfo = sshInfoService.getById(host.getHostId()); + List remoteList = + docker.getDockerInfo(sshInfo.getHostIp(), + Long.valueOf(sshInfo.getHostPort()), + sshUser.getCUsername(), + sshUser.getCPassword()); + + /* 3. 新增或更新 */ + addOrEdit(host.getDokerHostId(), oldMap, sshInfo, remoteList); + + /* 4. 删除已失效容器 */ + if (!oldMap.isEmpty()) { + List idsToDel = oldMap.values() + .stream() + .map(DockerContainerInfo::getId) + .collect(Collectors.toList()); + dockerInfoService.removeByIds(idsToDel); + } + + /* 5. 更新运行数 */ + long runningCnt = remoteList.stream() + .filter(r -> "1".equals(r.getStatus())) + .count(); + host.setRunNum(runningCnt); + host.setUpdateTime(vDate.getNow()); + dockerHostService.updateById(host); + } catch (Exception e) { + errorList.add(String.format("hostId=%s, error=%s", + host.getDokerHostId(), e.getMessage())); + } + } + + @GetMapping("/getApiInfo") public ApiResult> getApiInfo(String token) { if (vToken.isValidToken(token)) { @@ -222,45 +277,19 @@ public class sysController { * 获取容器列表 */ @GetMapping("/getApiDockerInfo") - public ApiResult getDockerInfo(String dockerHostId, String token) { + public ApiResult getDockerInfo(String token) { if (vToken.isValidToken(token)) { - DockerHost host = dockerHostService.getById(dockerHostId); - /* 1. 现有数据一次性加载到内存 */ - List oldList = - dockerInfoService.lambdaQuery() - .eq(DockerContainerInfo::getDokerHostId, dockerHostId) - .list(); - - Map oldMap = oldList.stream() - .collect(Collectors.toMap( - c -> buildKey(c.getDokerHostId(), c.getImageName(), c.getUnames()), - c -> c)); - /* 2. 远程最新数据 */ - SshUser sshUser = sshUserService.getById(host.getUserId()); - SshInfo sshInfo = sshInfoService.getById(host.getHostId()); - List remoteList = - docker.getDockerInfo(sshInfo.getHostIp(), - Long.valueOf(sshInfo.getHostPort()), - sshUser.getCUsername(), - sshUser.getCPassword()); - /* 3. 新增 or 更新 */ - addOrEdit(dockerHostId, oldMap, sshInfo, remoteList); - /* 4. 本轮未命中的即为“已失效”,批量删除 */ - if (!oldMap.isEmpty()) { - List idsToDel = oldMap.values() - .stream() - .map(DockerContainerInfo::getId) - .collect(Collectors.toList()); - dockerInfoService.removeByIds(idsToDel); - } - - /* 5. 更新运行数 */ - long runningCnt = remoteList.stream() - .filter(r -> "1".equals(r.getStatus())) - .count(); - host.setRunNum(runningCnt); - host.setUpdateTime(vDate.getNow()); - dockerHostService.updateById(host); + List dockerHosts = dockerHostService.list(); + List errorList = Collections.synchronizedList(new ArrayList<>()); + CompletableFuture[] futures = dockerHosts.stream() + .map(host -> CompletableFuture.runAsync( + () -> handleSingleDockerHost(host, errorList), hostExecutor)) + .toArray(CompletableFuture[]::new); + // 等待全部执行完毕 + CompletableFuture.allOf(futures).join(); + return errorList.isEmpty() + ? ApiResult.success() + : ApiResult.error(); } return ApiResult.error(); }