|
@@ -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] 执行任务
|
|
|
*/
|