{"id":50878382,"url":"https://github.com/Sun-12138/comfyui-spring-boot","last_synced_at":"2026-07-03T02:01:18.246Z","repository":{"id":251713515,"uuid":"837626047","full_name":"Sun-12138/comfyui-spring-boot","owner":"Sun-12138","description":"Spring Boot Support for ComfyUI","archived":false,"fork":false,"pushed_at":"2024-08-28T08:44:40.000Z","size":118,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-08-28T18:23:09.951Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Sun-12138.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-03T14:27:24.000Z","updated_at":"2024-08-28T08:44:43.000Z","dependencies_parsed_at":"2024-08-27T17:55:33.316Z","dependency_job_id":null,"html_url":"https://github.com/Sun-12138/comfyui-spring-boot","commit_stats":null,"previous_names":["sun-12138/comfyui-spring-boot"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Sun-12138/comfyui-spring-boot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sun-12138%2Fcomfyui-spring-boot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sun-12138%2Fcomfyui-spring-boot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sun-12138%2Fcomfyui-spring-boot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sun-12138%2Fcomfyui-spring-boot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Sun-12138","download_url":"https://codeload.github.com/Sun-12138/comfyui-spring-boot/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sun-12138%2Fcomfyui-spring-boot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35069183,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-03T02:00:05.635Z","response_time":110,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-15T12:00:25.793Z","updated_at":"2026-07-03T02:01:18.234Z","avatar_url":"https://github.com/Sun-12138.png","language":"Java","funding_links":[],"categories":["人工智能"],"sub_categories":["LLM客户端"],"readme":"# spring-boot-comfyui\n\n\u003e 支持SpringBoot调用ComfyUI服务API、提交绘图任务到队列、实时获取任务进度，支持单机和集群使用\n\n## 支持的队列类型\n\n-   普通阻塞队列\n-   RabbitMQ\n-   自定义任务提交(后续支持)\n\n## 版本要求\n\nJava \u003e= 8\n\nComfyUI版本：2024-08-13 03:03:33(建议不低于该版本)\n\n## 前置知识\n\nspring-boot-comfyui提交一个任务会有两种任务id\n\n- taskId\n\n  提交任务时需要两个参数，一个时自行定义的taskId，另一个是工作流，taskId最终会与提交工作流到ComfyUI服务产生的prompt_id(项目中参数名为comfyTaskId)进行关联\n\n- comfyTaskId(prompt_id)\n\n  即提交工作流返回的prompt_id\n\n## 如何使用\n\n### 添加Maven依赖\n\n建议使用2.0之后的版本\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.sun-12138\u003c/groupId\u003e\n    \u003cartifactId\u003ecomfyui-spring-boot-starter\u003c/artifactId\u003e\n    \u003cversion\u003e2.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### 添加配置\n\n- comfyui配置\n\n  ```yaml\n  spring:\n    comfyui:\n      # 主机地址 默认127.0.0.1\n      host: 127.0.0.1\n      # comfyui端口号 默认8188\n      port: 8188\n      # comfyui会话id 默认随机生成UUID\n      client-id: test\n      # 提交绘图任务时，如果Comfyui内部有非当前服务提交的任务时是否自动取消\n      auto-clear-task: true\n      queue:\n        # 任务队列类型 目前支持: queue(阻塞队列)、rabbit 后续支持: rocket、kafka、custom\n        type: queue\n  ```\n\n- 若类型选择的消息队列则还需配置对应的消息队列配置\n\n  ```yaml\n  spring:\n    rabbitmq:\n      host: 127.0.0.1\n      port: 5672\n      username: admin\n      password: 123456\n      virtual-host: /\n      listener:\n        simple:\n          acknowledge-mode: manual # 手动ACK(一定要添加)\n  ```\n\n### 监听任务进度\n\n- 方法1: 实现ITaskProcessReceiver接口并注册为bean\n\n  ```java\n  @Slf4j\n  @Component\n  public class TaskProcessMonitor implements ITaskProcessReceiver {\n  \n      /**\n       * 任务开始\n       *\n       * @param start 任务开始信息\n       */\n      @Override\n      public void taskStart(ComfyTaskStart start) {\n          log.info(\"任务开始, 任务id:{}\", start.getTaskId());\n      }\n  \n      /**\n       * 当前执行的节点和节点执行进度\n       *\n       * @param progress 进度信息\n       */\n      @Override\n      public void taskNodeProgress(ComfyTaskNodeProgress progress) {\n          log.info(\"任务进度更新, 任务id: {}, 内部任务id: {}, 当前节点名: {}, 当前进度:{}%\", progress.getTaskId(), progress.getComfyTaskId(), progress.getNode().getTitle(), progress.getPercent());\n      }\n  \n      /**\n       * 任务进度预览效果图\n       *\n       * @param preview 预览图信息\n       */\n      @Override\n      public void taskProgressPreview(ComfyTaskProgressPreview preview) {\n          log.info(\"任务进度预览, 任务id: {}, 内部任务id: {}, 预览: \u003c图片\u003e\", preview.getTaskId(), preview.getComfyTaskId());\n      }\n  \n      /**\n       * 任务输出的图片\n       *\n       * @param output 输出信息\n       */\n      @Override\n      public void taskOutput(ComfyTaskOutput output) {\n          log.info(\"任务输出结果, 任务id: {}, 节点名: {}, 内部任务id: {}\", output.getTaskId(), output.getNode().getTitle(), output.getComfyTaskId());\n      }\n  \n      /**\n       * 任务完成\n       *\n       * @param complete 任务完成信息\n       */\n      @Override\n      public void taskComplete(ComfyTaskComplete complete) {\n          log.info(\"任务完成, 任务id: {}, 内部任务id: {}\", complete.getTaskId(), complete.getComfyTaskId());\n      }\n  \n      /**\n       * 任务失败\n       *\n       * @param error 任务错误信息\n       */\n      @Override\n      public void taskError(ComfyTaskError error) {\n          log.error(\"任务错误， 任务id:{}, 内部任务id: {}, 错误信息: {}\", error.getTaskId(), error.getComfyTaskId(), error.getErrorInfo());\n      }\n  \n      /**\n       * 绘图队列任务个数更新\n       *\n       * @param taskNumber 队列任务信息\n       */\n      @Override\n      public void taskNumberUpdate(ComfyTaskNumber taskNumber) {}\n  \n      /**\n       * 当前系统负载\n       *\n       * @param performance 系统状态\n       */\n      @Override\n      public void systemPerformance(ComfySystemPerformance performance) {}\n  }\n  ```\n\n- 方法2: 使用@TaskProcessListener注解\n\n  ```java\n  @Slf4j\n  @Component\n  public class TestMonitor2 {\n  \n      @TaskProcessListener(TaskProcessType.START)\n      private void testListener(ComfyTaskStart comfyTaskStart) {\n          log.info(\"任务开始, 任务id:{}\", comfyTaskStart.getTaskId());\n      }\n  \n      @TaskProcessListener(TaskProcessType.PROGRESS)\n      private void testListener3(ComfyTaskNodeProgress progress) {\n          log.info(\"任务进度更新, 任务id: {}, 内部任务id: {}, 当前节点名: {}, 当前进度:{}%\", progress.getTaskId(), progress.getComfyTaskId(), progress.getNode().getTitle(), progress.getPercent());\n      }\n  \n      @TaskProcessListener(TaskProcessType.COMPLETE)\n      private void testListener2(ComfyTaskComplete complete) {\n          log.info(\"任务完成, 任务id: {}, 内部任务id: {}\", complete.getTaskId(), complete.getComfyTaskId());\n      }\n  }\n  ```\n\n- 方法3: 发布订阅模式(支持只监听某个任务id的事件)\n\n  ```java\n  @Slf4j\n  @Component\n  @RequiredArgsConstructor\n  public class TestSubject {\n  \n      /**\n       * 任务进度发布者\n       */\n      private final TaskProcessSubjectPublisher publisher;\n  \n      /**\n       * 资源文件加载者\n       */\n      private final ResourceLoader resourceLoader;\n  \n      /**\n       * 任务提交者\n       */\n      private final IDrawingTaskSubmit taskSubmit;\n  \n      /**\n       * SpringApplication启动完成后执行\n       */\n      @EventListener(ApplicationReadyEvent.class)\n      public void startSubscribe() {\n          submitTask(\"test1\");\n          //订阅任务开始事件 可以订阅某个类型的事件而不是某个任务的事件\n          publisher.subscribe(TaskProcessType.START, new TaskStartSubscriber(publisher));\n          //订阅任务进度更新事件\n          publisher.subscribe(\"test1\", TaskProcessType.PROGRESS, new TaskProgressSubscriber());\n          //订阅任务完成事件\n          publisher.subscribe(\"test1\", TaskProcessType.COMPLETE, new TaskCompleteSubscriber(publisher));\n      }\n  \n      /**\n       * 提交任务\n       *\n       * @param taskId 自定义任务id\n       */\n      public void submitTask(String taskId) {\n          ComfyWorkFlow flow = getFlow();\n          assert flow != null;\n          ComfyWorkFlowNode node = flow.getNode(\"3\");\n          // 设置随机种子\n          int randomSeed = Math.abs(new Random().nextInt());\n          node.getInputs().put(\"seed\", randomSeed);\n          taskSubmit.submit(new DrawingTaskInfo(taskId, flow, 5, TimeUnit.MINUTES));\n      }\n  \n      /**\n       * 获取默认的工作流\n       */\n      private ComfyWorkFlow getFlow() {\n          //从resources文件夹下读取default.json文件\n          Resource resource = resourceLoader.getResource(\"classpath:\" + \"default.json\");\n          StringBuilder flowStr = new StringBuilder();\n          try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource.getInputStream()))) {\n              String line;\n              while ((line = reader.readLine()) != null) {\n                  flowStr.append(line);\n              }\n          } catch (IOException e) {\n              return null;\n          }\n          return ComfyWorkFlow.of(flowStr.toString());\n      }\n  \n      /**\n       * 绘图任务开始订阅者\n       */\n      @RequiredArgsConstructor\n      private static class TaskStartSubscriber implements ITaskProcessSubjectSubscriber {\n  \n          private final TaskProcessSubjectPublisher publisher;\n  \n          /**\n           * 通知消息\n           *\n           * @param event 事件信息\n           */\n          @Override\n          public \u003cT extends IComfyTaskProcess\u003e void notify(TaskProcessMessage\u003cT\u003e event) {\n              ComfyTaskStart start = (ComfyTaskStart) event.getData();\n              log.info(\"任务开始, 任务id:{}\", start.getTaskId());\n              //取消订阅\n              publisher.unSubscribe(start.getTaskId(), TaskProcessType.START, this);\n          }\n      }\n  \n      /**\n       * 绘图任务进度更新订阅者\n       */\n      private static class TaskProgressSubscriber implements ITaskProcessSubjectSubscriber {\n  \n          /**\n           * 通知消息\n           *\n           * @param event 事件信息\n           */\n          @Override\n          public \u003cT extends IComfyTaskProcess\u003e void notify(TaskProcessMessage\u003cT\u003e event) {\n              ComfyTaskNodeProgress progress = (ComfyTaskNodeProgress) event.getData();\n              log.info(\"任务进度更新, 任务id: {}, 内部任务id: {}, 当前节点名: {}, 当前进度:{}%\", progress.getTaskId(), progress.getComfyTaskId(), progress.getNode().getTitle(), progress.getPercent());\n          }\n      }\n  \n      /**\n       * 绘图任务完成订阅者\n       */\n      @RequiredArgsConstructor\n      private static class TaskCompleteSubscriber implements ITaskProcessSubjectSubscriber {\n  \n          private final TaskProcessSubjectPublisher publisher;\n  \n          /**\n           * 通知消息\n           *\n           * @param event 事件信息\n           */\n          @Override\n          public \u003cT extends IComfyTaskProcess\u003e void notify(TaskProcessMessage\u003cT\u003e event) {\n              ComfyTaskComplete complete = (ComfyTaskComplete) event.getData();\n              log.info(\"任务完成, 任务id: {}, 内部任务id: {}\", complete.getTaskId(), complete.getComfyTaskId());\n              //取消订阅\n              publisher.unSubscribe(complete.getTaskId(), TaskProcessType.PROGRESS, this);\n          }\n      }\n  }\n  ```\n\n### 提交任务\n\n注入IDrawingTaskSubmit类型的bean调用submit方法\n\n```java\n@Slf4j\n@Component\n@RequiredArgsConstructor\npublic class TestSubmit {\n\n    private final IDrawingTaskSubmit taskSubmit;\n    private final ResourceLoader resourceLoader;\n\n    @PostConstruct\n    public void testSubmitTask() {\n        submitTask(\"test1\");\n        submitTask(\"test2\");\n        log.info(\"绘图任务提交完成\");\n    }\n\n    /**\n     * 提交任务\n     *\n     * @param taskId 自定义任务id\n     */\n    public void submitTask(String taskId) {\n        ComfyWorkFlow flow = getFlow();\n        assert flow != null;\n        ComfyWorkFlowNode node = flow.getNode(\"3\");\n        // 设置随机种子\n        int randomSeed = Math.abs(new Random().nextInt());\n        node.inputs().put(\"seed\", randomSeed);\n        // 提交任务\n        taskSubmit.submit(new DrawingTaskInfo(taskId, flow, 5, TimeUnit.MINUTES));\n    }\n\n    /**\n     * 获取默认的工作流\n     */\n    private ComfyWorkFlow getFlow() {\n        //从resources文件夹下读取default.json文件\n        Resource resource = resourceLoader.getResource(\"classpath:\" + \"default.json\");\n        StringBuilder flowStr = new StringBuilder();\n        try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource.getInputStream()))) {\n            String line;\n            while ((line = reader.readLine()) != null) {\n                flowStr.append(line);\n            }\n        } catch (IOException e) {\n            return null;\n        }\n        return ComfyWorkFlow.of(flowStr.toString());\n    }\n}\n```\n\n### 修改工作流节点参数值\n\n```java\n//工作流字符串\nString workflowStr = \"{...}\";\nComfyWorkFlow flow = ComfyWorkFlow.of(workflowStr);\nassert flow != null;\n// 根据工作流节点中的节点id获取节点对象\nComfyWorkFlowNode node = flow.getNode(\"3\");\n// 设置随机种子\nint randomSeed = Math.abs(new Random().nextInt());\nnode.inputs().put(\"seed\", randomSeed);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSun-12138%2Fcomfyui-spring-boot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FSun-12138%2Fcomfyui-spring-boot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSun-12138%2Fcomfyui-spring-boot/lists"}