ソースを参照

新增 comfyui getBestPort 方法

tsurumure 1 ヶ月 前
コミット
e8ed635592

+ 4 - 1
src/main/java/com/backendsys/modules/common/Filter/WebClientFilter.java

@@ -1,5 +1,7 @@
 package com.backendsys.modules.common.Filter;
 
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import org.springframework.core.io.buffer.DataBuffer;
 import org.springframework.core.io.buffer.DataBufferUtils;
 import org.springframework.core.io.buffer.DefaultDataBufferFactory;
@@ -26,7 +28,8 @@ public class WebClientFilter {
 
                     // 记录响应体
                     String bodyStr = new String(bodyBytes, StandardCharsets.UTF_8);
-                    System.out.println("[logRequestFilter] Response Body: " + bodyStr);
+//                    System.out.println("[logRequestFilter] Response Body: " + bodyStr);
+                    System.out.println("[logRequestFilter] Response Body: " + StrUtil.sub(bodyStr, 0, 1000));
 
                     // 重新构建完整的响应
                     return Mono.just(ClientResponse.create(response.statusCode())

+ 7 - 2
src/main/java/com/backendsys/modules/common/config/security/utils/JwtUtil.java

@@ -5,6 +5,7 @@ import cn.hutool.json.JSONUtil;
 import com.backendsys.modules.common.config.security.entity.SecurityAppUserInfo;
 import com.backendsys.modules.common.config.security.entity.SecurityUserInfo;
 import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.JwtException;
 import io.jsonwebtoken.Jwts;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.stereotype.Service;
@@ -126,8 +127,12 @@ public class JwtUtil {
      * @return
      */
     public Claims extractAllClaims(String token){
-//        return Jwts.parser().setSigningKey(getSignInKey()).build().parseClaimsJws(token).getBody();
-        return Jwts.parser().verifyWith(getSignInKey()).build().parseSignedClaims(token).getPayload();
+        try {
+            return Jwts.parser().verifyWith(getSignInKey()).build().parseSignedClaims(token).getPayload();
+        } catch (JwtException e) {
+            System.out.println("Token 解析失败: " + e.getMessage());
+        }
+        return null;
     }
 
     /**

+ 1 - 1
src/main/java/com/backendsys/modules/crt/controller/CrtGenerateController.java

@@ -26,7 +26,7 @@ public class CrtGenerateController {
     @Operation(summary = "查询任务队列")
     @GetMapping("/api/crt/generate/getQueue")
     public Result getQueue() {
-        return Result.success().put("data", crtGenerateService.getQueue());
+        return Result.success().put("data", crtGenerateService.getQueue(8000));
     }
 
     @PreAuthorize("@sr.hasPermission('36.3')")

+ 1 - 1
src/main/java/com/backendsys/modules/crt/service/CrtGenerateService.java

@@ -8,7 +8,7 @@ import java.util.Map;
 public interface CrtGenerateService {
 
     // [ComfyUI] 查询任务队列
-    Map<String, Object> getQueue();
+    Map<String, Object> getQueue(Integer port);
 
     // 短剧创作-生成图片
     Map<String, Object> generateImage(CrtDramaProjectStoryboard crtDramaProjectStoryboard);

+ 9 - 8
src/main/java/com/backendsys/modules/crt/service/impl/CrtGenerateServiceImpl.java

@@ -44,9 +44,9 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
     private Boolean IS_SAVE;
 
     @Autowired
-    private ComfyuiService comfyUIService;
+    private ComfyuiService comfyuiService;
     @Autowired
-    private ComfyuiSocketService comfyUISocketService;
+    private ComfyuiSocketService comfyuiSocketService;
 
     @Autowired
     private ComfyuiText2ImageService comfyuiText2ImageService;
@@ -64,9 +64,9 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
      * [ComfyUI] 查询任务队列
      */
     @Override
-    public Map<String, Object> getQueue() {
+    public Map<String, Object> getQueue(Integer port) {
         // [ComfyUI] 执行任务
-        Mono<ComfyuiQueue> cfQueueMono = comfyUIService.getQueue();
+        Mono<ComfyuiQueue> cfQueueMono = comfyuiService.getQueue(port);
         ComfyuiQueue response = cfQueueMono.block();
         System.out.println("结果: " + response);
 
@@ -157,21 +157,22 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
 
 
 
+
 //        // -- [ComfyUI] 创建 WebSocket 监听进度 --------------------------
 //        Map<String, Object> params = new LinkedHashMap<>();
 //        params.put("drama_project_storyboard_id", drama_project_storyboard_id);
 //        // - is_save: 是否转存到 cos/tos
-//        comfyUISocketService.connectToSse(client_id, 8000, IS_SAVE, params).subscribe();
+//        comfyuiSocketService.connectToSse(client_id, 8000, IS_SAVE, params).subscribe();
 
         // -- [ComfyUI] 执行/排队生图任务 --------------------------------------------
 
+//        ComfyuiResponse response = comfyuiText2ImageService.generateText2Image(client_id, comfyuiText2Image);
+//        System.out.println("结果: " + response);
+//        // 结果: ComfyuiResponse(client_id=1a8a2d01-5500-437f-bb11-7a986130da48, prompt_id=c74501ed-6755-48f8-a440-aef3474b523c, number=47, node_errors={}, error=null)
 
 
 
 
-//        ComfyuiResponse response = null; // comfyuiText2ImageService.generateText2Image(client_id, comfyuiText2Image);
-//        System.out.println("结果: " + response);
-//        // 结果: ComfyuiResponse(client_id=1a8a2d01-5500-437f-bb11-7a986130da48, prompt_id=c74501ed-6755-48f8-a440-aef3474b523c, number=47, node_errors={}, error=null)
 
         Map<String, Object> resp = new LinkedHashMap<>();
         resp.put("drama_project_storyboard_id", drama_project_storyboard_id);

+ 13 - 5
src/main/java/com/backendsys/modules/sdk/comfyui/controller/ComfyuiDemoController.java

@@ -4,7 +4,6 @@ import com.backendsys.modules.common.config.security.annotations.Anonymous;
 import com.backendsys.modules.sdk.comfyui.service.ComfyuiService;
 import com.backendsys.modules.sdk.comfyui.service.ComfyuiSocketService;
 import com.backendsys.modules.sdk.tencentcloud.cos.service.TencentCosService;
-import com.backendsys.modules.upload.entity.SysFileResult;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -17,9 +16,9 @@ public class ComfyuiDemoController {
     private TencentCosService tencentCosService;
 
     @Autowired
-    private ComfyuiService comfyUIService;
+    private ComfyuiService comfyuiService;
     @Autowired
-    private ComfyuiSocketService comfyUISocketService;
+    private ComfyuiSocketService comfyuiSocketService;
 
     /**
      * [ComfyUI] 创建 WebSocket 监听连接
@@ -27,7 +26,7 @@ public class ComfyuiDemoController {
     @Anonymous
     @PostMapping("/api/comfyui/ws/connect")
     public String connect(String clientId) {
-        comfyUISocketService.connect(clientId, 8000).subscribe();
+        comfyuiSocketService.connect(clientId, 8000).subscribe();
         return "Connection initiated for client_id: " + clientId;
     }
 
@@ -37,7 +36,7 @@ public class ComfyuiDemoController {
     @Anonymous
     @PostMapping("/api/comfyui/ws/disconnect")
     public String disconnect(String clientId) {
-        comfyUISocketService.disconnect(clientId).subscribe();
+        comfyuiSocketService.disconnect(clientId).subscribe();
         return "Disconnected: " + clientId;
     }
 
@@ -49,4 +48,13 @@ public class ComfyuiDemoController {
 //        return tencentCosService.urlToCOS(url, "png");
 //    }
 
+    /**
+     * [ComfyUI] 获取最佳端口
+     */
+    @Anonymous
+    @GetMapping("/api/comfyui/getBestPort")
+    public Integer getBestPort() {
+        return comfyuiService.getBestPort();
+    }
+
 }

+ 9 - 0
src/main/java/com/backendsys/modules/sdk/comfyui/entity/ComfyuiQueueItem.java

@@ -0,0 +1,9 @@
+package com.backendsys.modules.sdk.comfyui.entity;
+
+import lombok.Data;
+
+@Data
+public class ComfyuiQueueItem {
+    private Integer port;
+    private Integer count;
+}

+ 4 - 1
src/main/java/com/backendsys/modules/sdk/comfyui/service/ComfyuiService.java

@@ -8,7 +8,10 @@ import reactor.core.publisher.Mono;
 public interface ComfyuiService {
 
     // [ComfyUI] 查询任务队列
-    Mono<ComfyuiQueue> getQueue();
+    Mono<ComfyuiQueue> getQueue(Integer port);
+
+    // [ComfyUI] 获取最佳可用端口
+    Integer getBestPort();
 
     // [ComfyUI] 执行任务 (通用)
     Mono<ComfyuiResponse> prompt(String client_id, JSONObject prompt);

+ 67 - 2
src/main/java/com/backendsys/modules/sdk/comfyui/service/impl/ComfyuiServiceImpl.java

@@ -1,7 +1,9 @@
 package com.backendsys.modules.sdk.comfyui.service.impl;
 
+import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import com.backendsys.modules.common.Filter.WebClientFilter;
+import com.backendsys.modules.sdk.comfyui.entity.ComfyuiQueueItem;
 import com.backendsys.modules.sdk.comfyui.entity.ComfyuiRequest;
 import com.backendsys.modules.sdk.comfyui.entity.ComfyuiResponse;
 import com.backendsys.modules.sdk.comfyui.entity.ComfyuiQueue;
@@ -13,6 +15,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.reactive.function.client.WebClient;
 import reactor.core.publisher.Mono;
 
+import java.util.*;
 import java.util.function.Consumer;
 
 @Service
@@ -45,8 +48,8 @@ public class ComfyuiServiceImpl implements ComfyuiService {
     /**
      * [ComfyUI] 查询任务队列
      */
-    public Mono<ComfyuiQueue> getQueue() {
-        String url = "http://" + COMFYUI_HOST + ":8000/queue";
+    public Mono<ComfyuiQueue> getQueue(Integer port) {
+        String url = "http://" + COMFYUI_HOST + ":" + port + "/queue";
         WebClient webClient = getWebClient();
         return webClient.get()
                 .uri(url)
@@ -55,6 +58,68 @@ public class ComfyuiServiceImpl implements ComfyuiService {
                 .exchangeToMono(response -> response.bodyToMono(ComfyuiQueue.class));
     }
 
+    /**
+     * 获取最佳可用端口
+     */
+    @Override
+    public Integer getBestPort() {
+
+        List<Integer> PORTS = Arrays.asList(8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007);
+
+        List<ComfyuiQueueItem> queueCountsList = new ArrayList<>();
+
+        // 查询所有端口的队列情况
+        Boolean is_empty_queue = false;
+        for (int i = 0; i < PORTS.size(); i++) {
+
+            Integer port = PORTS.get(i);
+
+            ComfyuiQueueItem queueCountsItem = new ComfyuiQueueItem();
+            queueCountsItem.setPort(port);
+
+            System.out.println("-- 请求端口: " + port + " ---------------");
+
+            // [WebClient] 远程查询 ComfyuiAPI 队列情况
+            Mono<ComfyuiQueue> cfQueueMono = getQueue(port);
+            ComfyuiQueue response = cfQueueMono.block();
+            if (response != null) {
+                JSONArray queue_pending = response.getQueue_pending();
+                JSONArray queue_running = response.getQueue_running();
+                Integer count = queue_pending.size() + queue_running.size();
+                System.out.println("port: " + port + ", queueCount: " + count);
+
+                queueCountsItem.setCount(count);
+                queueCountsList.add(0, queueCountsItem);  // 从前面添加记录
+
+                if (queue_pending.size() == 0 && queue_running.size() == 0) {
+                    System.out.println("发现空的队列,停止遍历: " + port);
+                    is_empty_queue = true;
+                    break;  // 中断循环
+                }
+
+            } else {
+                System.out.println("port: " + port + ", response is null. ");
+            }
+
+        }
+
+        // 没有空队列时
+        // - 再次遍历,找出 count 最小值的行数据;
+        // - 将最小值行数据排序到最前面;
+        if (!is_empty_queue) {
+            queueCountsList.sort(Comparator.comparing(ComfyuiQueueItem::getCount));
+            System.out.println("-------------------------------");
+            System.out.println("没有空队列,将队列数量最小值的行数据排序到最前面: ");
+            System.out.println("port = " + queueCountsList.get(0).getPort() + ", count = " + queueCountsList.get(0).getCount());
+        }
+
+        System.out.println("-- 最终选择的端口: ----------------");
+        System.out.println("port = " + queueCountsList.get(0).getPort() + ", count = " + queueCountsList.get(0).getCount());
+
+        return queueCountsList.isEmpty() ? null : queueCountsList.get(0).getPort();
+    }
+
+
     /**
      * [ComfyUI] 执行任务
      */

+ 2 - 1
src/main/java/com/backendsys/modules/sdk/comfyui/service/impl/ComfyuiTaskServiceImpl.java

@@ -12,6 +12,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.Duration;
+import java.util.HashMap;
+import java.util.Map;
 
 @Service
 public class ComfyuiTaskServiceImpl implements ComfyuiTaskService {
@@ -27,7 +29,6 @@ public class ComfyuiTaskServiceImpl implements ComfyuiTaskService {
     private static final String MASTER_RK  = "master.job";
     private static final String TOKEN_KEY  = "user:%s:master_token";
 
-
     @Autowired
     private ComfyuiTaskDao comfyuiTaskDao;
 

+ 16 - 3
src/main/java/com/backendsys/modules/sdk/comfyui/service/impl/ComfyuiText2ImageServiceImpl.java

@@ -1,5 +1,8 @@
 package com.backendsys.modules.sdk.comfyui.service.impl;
 
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.backendsys.modules.sdk.comfyui.entity.ComfyuiResponse;
 import com.backendsys.modules.sdk.comfyui.entity.ComfyuiText2Image;
 import com.backendsys.modules.sdk.comfyui.enums.TaskTypeEnums;
 import com.backendsys.modules.sdk.comfyui.service.ComfyuiService;
@@ -7,6 +10,7 @@ import com.backendsys.modules.sdk.comfyui.service.ComfyuiText2ImageService;
 import com.backendsys.modules.sdk.comfyui.utils.ComfyuiUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import reactor.core.publisher.Mono;
 
 @Service
 public class ComfyuiText2ImageServiceImpl implements ComfyuiText2ImageService {
@@ -14,6 +18,9 @@ public class ComfyuiText2ImageServiceImpl implements ComfyuiText2ImageService {
     @Autowired
     private ComfyuiUtil comfyuiUtil;
 
+    @Autowired
+    private ComfyuiService comfyuiService;
+
     /**
      * [ComfyUI] 文生图 (7.16生图.json)
      * // ComfyuiResponse -> void
@@ -331,14 +338,20 @@ public class ComfyuiText2ImageServiceImpl implements ComfyuiText2ImageService {
 
         // [DB] 初始化任务
         Long task_id = comfyuiUtil.initComfyuiTask(client_id, prompt, TaskTypeEnums.TEXT_2_IMAGE.getValue());
+
+        JSONObject prompt_object = JSONUtil.parseObj(prompt);
+        Mono<ComfyuiResponse> cfPromptResponseMono = comfyuiService.prompt(client_id, prompt_object);
+        ComfyuiResponse response = cfPromptResponseMono.block();
+        System.out.println("response = " + response);
+
         return task_id;
 
 //        // [ComfyUI] 执行任务
 //        JSONObject prompt_object = JSONUtil.parseObj(prompt);
-//        Mono<ComfyuiResponse> cfPromptResponseMono = comfyUIService.prompt(client_id, prompt_object);
+//        Mono<ComfyuiResponse> cfPromptResponseMono = comfyuiService.prompt(client_id, prompt_object);
 //        ComfyuiResponse response = cfPromptResponseMono.block();
 //        response.setClient_id(client_id);
-
+//
 //        return response;
     }
 
@@ -426,7 +439,7 @@ public class ComfyuiText2ImageServiceImpl implements ComfyuiText2ImageService {
 
 //        // [ComfyUI] 执行任务
 //        JSONObject prompt_object = JSONUtil.parseObj(prompt);
-//        Mono<ComfyuiResponse> cfPromptResponseMono = comfyUIService.prompt(client_id, prompt_object);
+//        Mono<ComfyuiResponse> cfPromptResponseMono = comfyuiService.prompt(client_id, prompt_object);
 //        ComfyuiResponse response = cfPromptResponseMono.block();
 //        response.setClient_id(client_id);
 

+ 1 - 0
src/main/resources/application.yml

@@ -128,6 +128,7 @@ whitelist:
     /docs/**,
     /v3/**
   jwt:
+    /api/comfyui,
     /api/webhook,
     /api/public/**,
     /api/v2/public/**,