From d6011fd37ef2ff794d8efa93932bdf98d8f76dda Mon Sep 17 00:00:00 2001
From: guyue <1721849008@qq.com>
Date: 星期四, 10 七月 2025 21:26:55 +0800
Subject: [PATCH] 资源判断

---
 src/main/java/com/linghu/controller/CollectController.java |   95 +++++++++++++++++++++++++++++++----------------
 1 files changed, 62 insertions(+), 33 deletions(-)

diff --git a/src/main/java/com/linghu/controller/CollectController.java b/src/main/java/com/linghu/controller/CollectController.java
index bbd9f8e..e0fdeeb 100644
--- a/src/main/java/com/linghu/controller/CollectController.java
+++ b/src/main/java/com/linghu/controller/CollectController.java
@@ -6,26 +6,18 @@
 import java.util.*;
 import java.util.stream.Collectors;
 
-import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.linghu.mapper.PlatformMapper;
-import com.linghu.mapper.TypeMapper;
 import com.linghu.model.dto.*;
 import com.linghu.model.entity.*;
 import com.linghu.service.*;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.ParameterizedTypeReference;
 import org.springframework.http.*;
-import org.springframework.web.client.RestTemplate;
 import org.springframework.web.reactive.function.client.WebClient;
-import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -37,7 +29,6 @@
 import io.swagger.annotations.ApiOperation;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
-import reactor.core.publisher.SignalType;
 
 import org.springframework.web.bind.annotation.* ;
 import org.springframework.http.HttpStatus;
@@ -199,39 +190,77 @@
                 .next() // 找到第一个完成的响应后结束流
                 .then(); // 转换为Mono<Void>
     }*/
+   // 添加一个辅助方法来安全地将字符串转换为double
+   private double parseUsage(String usageStr) {
+       try {
+           if (usageStr != null) {
+               // 移除可能存在的百分号
+               usageStr = usageStr.replace("%", "").trim();
+               return Double.parseDouble(usageStr);
+           }
+           return 0.0;
+       } catch (NumberFormatException e) {
+           log.error("解析资源使用率失败: {}", e.getMessage());
+           return 0.0;
+       }
+   }
    @PostMapping("/search")
    @ApiOperation(value = "开始采集")
-   public Mono<List<SearchTaskResponse>> createSearchTask(
+   public Mono<ResponseResult<?>> createSearchTask(
            @RequestBody SearchTaskRequest searchTaskRequest,
            HttpServletRequest request) throws JsonProcessingException {
 
-       int maxConcurrentUsers = searchTaskRequest.getConfig() != null ?
-               searchTaskRequest.getConfig().getMax_concurrent_users() : 3;
+       // 首先检查服务器资源
+       return getServerResource()
+               .flatMap(resourceResponse -> {
+                   // 将字符串类型的使用率转换为double类型
+                   double cpuUsage = parseUsage(resourceResponse.getCpu_usage_percent());
+                   double memoryUsage = parseUsage(resourceResponse.getMemory_usage_percent());
+                   // 检查CPU和内存使用率
+                   if (cpuUsage >= 90.0 || memoryUsage >= 90.0) {
+                       String errorMsg = String.format("服务器资源不足:CPU使用率 %.1f%%,内存使用率 %.1f%%",
+                               resourceResponse.getCpu_usage_percent(), resourceResponse.getMemory_usage_percent());
+                       log.warn(errorMsg);
+                       return Mono.just(ResponseResult.error(503, errorMsg));
+                   }
 
-       // 获取 keywordId
-       Integer keywordId = searchTaskRequest.getKeyword_id();
-       //分割
-       List<List<UserDto>> userBatches = splitUsersIntoBatches(searchTaskRequest.getUsers(), maxConcurrentUsers,keywordId);
+                   int maxConcurrentUsers = searchTaskRequest.getConfig() != null ?
+                           searchTaskRequest.getConfig().getMax_concurrent_users() : 3;
+                   List<List<UserDto>> userBatches = splitUsersIntoBatches(searchTaskRequest.getUsers(), maxConcurrentUsers);
 
-       return Flux.fromIterable(userBatches)
-               .flatMap(batch -> {
-                   SearchTaskRequest batchRequest = new SearchTaskRequest();
-                   batchRequest.setUsers(batch);
-                   batchRequest.setQuestions(searchTaskRequest.getQuestions());
-                   batchRequest.setConfig(searchTaskRequest.getConfig());
-                   batchRequest.setSave_to_database(searchTaskRequest.getSave_to_database());
-                   batchRequest.setWebhook_url(searchTaskRequest.getWebhook_url());
-                   batchRequest.setKeyword_id(keywordId);
+                   // 获取 keywordId
+                   Integer keywordId = searchTaskRequest.getKeyword_id();
+                   //分割
 
-                   return createSingleBatchTask(batchRequest)
-                           .delaySubscription(Duration.ofSeconds(2)); // 批次之间添加延迟
-               }, 1) // 限制并发数为1,确保顺序执行
-               .collectList() // 收集所有批次的响应
-               .flatMap(responses ->
+     
+                   return Flux.fromIterable(userBatches)
+                           .flatMap(batch -> {
+                               SearchTaskRequest batchRequest = new SearchTaskRequest();
+                               batchRequest.setUsers(batch);
+                               batchRequest.setQuestions(searchTaskRequest.getQuestions());
+                               batchRequest.setConfig(searchTaskRequest.getConfig());
+                               batchRequest.setSave_to_database(searchTaskRequest.getSave_to_database());
+                               batchRequest.setWebhook_url(searchTaskRequest.getWebhook_url());
+                               batchRequest.setKeyword_id(keywordId);
 
-                       saveKeywordTasks(keywordId, responses) // 保存关联关系
-                               .thenReturn(responses) // 返回原始响应
-               );
+                               return createSingleBatchTask(batchRequest)
+                                       .delaySubscription(Duration.ofSeconds(2)); // 批次之间添加延迟
+                           }, 1) // 限制并发数为1,确保顺序执行
+                           .collectList() // 收集所有批次的响应
+                           .flatMap(responses ->
+                                   saveKeywordTasks(keywordId, responses) // 保存关联关系
+                                           .thenReturn(responses) // 返回原始响应
+                           )
+                           .map(responses -> ResponseResult.success(responses)) // 使用ResponseResult包装结果
+                           .onErrorResume(e -> {
+                               log.error("创建搜索任务失败: {}", e.getMessage(), e);
+                               return Mono.just(ResponseResult.error("创建搜索任务失败: " + e.getMessage()));
+                           });
+               })
+               .onErrorResume(e -> {
+                   log.error("检查服务器资源失败: {}", e.getMessage(), e);
+                   return Mono.just(ResponseResult.error("检查服务器资源失败: " + e.getMessage()));
+               });
    }
 
     private Mono<Void> saveKeywordTasks(Integer keywordId, List<SearchTaskResponse> taskResponses) {

--
Gitblit v1.7.1