task-98: 移除 similar-asin/appearance-patent 模块 Coze,状态机与共享组件改名 LLM
Build Backend JAR / build (push) Has been cancelled

- similarasin/appearancepatent 模块全部 Coze 工作流调用改走 direct-LLM(已确认唯一运行路径)
- 共享组件改名:CozeTaskQueueGate→TaskQueueGate、CozeGroupResultPropagator→GroupResultPropagator
- 状态机改名:biz_task_scope_state 的 coze_* 列→llm_*、stateJson coze 键→llm(V100 迁移已应用生产)
- 删除 biz_coze_credential 表、CozeCredential* 类、SimilarAsinCozeClient、AppearancePatentCozeClient→LlmClient
- 前端 brand 页 Coze 文案→LLM;Python 后端删除 cozepy 依赖与死配置
- 修复 TaskResultFileJobWorker 启动失败:TaskFileJobConfig 注册 ResultFileJobHandlerRegistry 与 13 个 handler bean(含 validateCoverage 启动校验)
This commit is contained in:
2026-09-01 02:19:45 +08:00
parent 0cc7380205
commit e2607ab723
109 changed files with 6903 additions and 4582 deletions
@@ -22,11 +22,11 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* Task 74:隔离调度线程池、文件作业线程池和外部 Coze/图片执行池。
* Task 74:隔离调度线程池、文件作业线程池和外部任务队列/图片执行池。
* 三个执行池各自独立配置、独立命名、容量互不影响:调度池
* aiimage.scheduling.pool-size,默认 4)与文件作业派发池
* aiimage.result-file-job.*,默认 2 线程/队列 200)互不共享线程;
* 外部 Coze 池以虚拟线程 + 信号量限流(默认 12)。容量非法值统一
* 外部任务队列池以虚拟线程 + 信号量限流(默认 12)。容量非法值统一
* 钳制到最小值;任务失败后信号量名额与调度槽位必须释放,任一池打满
* 不影响其他池。
*/
@@ -55,14 +55,14 @@ class ThreadPoolIsolationConfigTest {
return executor;
}
private ExecutorService newCozeVirtual() {
ExecutorService executor = new TaskFileJobConfig().cozeVirtualThreadExecutor();
private ExecutorService newTaskQueueVirtual() {
ExecutorService executor = new TaskFileJobConfig().taskQueueVirtualThreadExecutor();
closeables.add(() -> executor.shutdownNow());
return executor;
}
private TaskExecutor newCoze(ExecutorService virtualExecutor, int maxConcurrent) {
return new TaskFileJobConfig().cozeTaskExecutor(virtualExecutor, maxConcurrent, 4, null);
private TaskExecutor newTaskQueue(ExecutorService virtualExecutor, int maxConcurrent) {
return new TaskFileJobConfig().taskQueueExecutor(virtualExecutor, maxConcurrent, 4, null);
}
@Test
@@ -78,15 +78,15 @@ class ThreadPoolIsolationConfigTest {
assertEquals(2, dispatch.getMaxPoolSize(), "文件作业池 core=max,不随压力扩张");
assertEquals(200, dispatch.getQueueCapacity());
ExecutorService cozeVirtual = newCozeVirtual();
TaskExecutor coze = newCoze(cozeVirtual, 12);
ExecutorService taskQueueVirtual = newTaskQueueVirtual();
TaskExecutor taskQueue = newTaskQueue(taskQueueVirtual, 12);
AtomicBoolean ran = new AtomicBoolean(false);
CountDownLatch done = new CountDownLatch(1);
coze.execute(() -> {
taskQueue.execute(() -> {
ran.set(true);
done.countDown();
});
assertTrue(done.await(5, TimeUnit.SECONDS), "Coze 池默认限流 12,正常提交即执行");
assertTrue(done.await(5, TimeUnit.SECONDS), "任务队列池默认限流 12,正常提交即执行");
assertTrue(ran.get());
}
@@ -96,8 +96,8 @@ class ThreadPoolIsolationConfigTest {
// 线程名前缀互不相同,线程转储可识别归属池。
ThreadPoolTaskScheduler scheduler = newScheduler(6);
ThreadPoolTaskExecutor dispatch = newDispatch(3, 500);
ExecutorService cozeVirtual = newCozeVirtual();
TaskExecutor coze = newCoze(cozeVirtual, 8);
ExecutorService taskQueueVirtual = newTaskQueueVirtual();
TaskExecutor taskQueue = newTaskQueue(taskQueueVirtual, 8);
assertEquals(6, scheduler.getScheduledThreadPoolExecutor().getCorePoolSize());
assertEquals(3, dispatch.getCorePoolSize());
assertEquals(500, dispatch.getQueueCapacity());
@@ -105,7 +105,7 @@ class ThreadPoolIsolationConfigTest {
CountDownLatch all = new CountDownLatch(3);
dispatch.execute(all::countDown);
scheduler.schedule((Runnable) all::countDown, new Date(System.currentTimeMillis() + 50));
coze.execute(all::countDown);
taskQueue.execute(all::countDown);
assertTrue(all.await(5, TimeUnit.SECONDS), "三个池同时执行互不阻塞");
assertNotEquals(scheduler.getThreadNamePrefix(), dispatch.getThreadNamePrefix(),
@@ -139,11 +139,11 @@ class ThreadPoolIsolationConfigTest {
ThreadPoolTaskExecutor dispatch = newDispatch(0, 0);
assertEquals(1, dispatch.getCorePoolSize(), "文件作业池 0 钳制到 1");
assertEquals(10, dispatch.getQueueCapacity(), "队列 0 钳制到 10");
ExecutorService cozeVirtual = newCozeVirtual();
TaskExecutor coze = newCoze(cozeVirtual, 0);
ExecutorService taskQueueVirtual = newTaskQueueVirtual();
TaskExecutor taskQueue = newTaskQueue(taskQueueVirtual, 0);
CountDownLatch done = new CountDownLatch(1);
coze.execute(done::countDown);
assertTrue(done.await(5, TimeUnit.SECONDS), "Coze 池 0 钳制到 1 后仍可执行");
taskQueue.execute(done::countDown);
assertTrue(done.await(5, TimeUnit.SECONDS), "任务队列池 0 钳制到 1 后仍可执行");
}
@Test
@@ -200,23 +200,23 @@ class ThreadPoolIsolationConfigTest {
assertEquals(1, dispatch.getCorePoolSize());
assertEquals(10, dispatch.getQueueCapacity());
ExecutorService cozeVirtual = newCozeVirtual();
TaskExecutor coze = newCoze(cozeVirtual, -3);
assertThrows(IllegalArgumentException.class, () -> coze.execute(null), "null 任务被拒绝");
ExecutorService taskQueueVirtual = newTaskQueueVirtual();
TaskExecutor taskQueue = newTaskQueue(taskQueueVirtual, -3);
assertThrows(IllegalArgumentException.class, () -> taskQueue.execute(null), "null 任务被拒绝");
CountDownLatch done = new CountDownLatch(1);
coze.execute(done::countDown);
taskQueue.execute(done::countDown);
assertTrue(done.await(5, TimeUnit.SECONDS), "非法配置钳制后池仍可用");
}
@Test
void test_task_074_image_dispatch_job_dependency_failure_releases_resources() throws Exception {
// 依赖失败:Coze 任务抛异常后信号量名额必须释放(后续任务可执行);
// 依赖失败:任务队列任务抛异常后信号量名额必须释放(后续任务可执行);
// 调度任务异常被 error handler 吞掉,调度器继续可用。
ExecutorService cozeVirtual = newCozeVirtual();
TaskExecutor coze = newCoze(cozeVirtual, 2);
ExecutorService taskQueueVirtual = newTaskQueueVirtual();
TaskExecutor taskQueue = newTaskQueue(taskQueueVirtual, 2);
CountDownLatch blockerHeld = new CountDownLatch(1);
CountDownLatch releaseBlocker = new CountDownLatch(1);
coze.execute(() -> {
taskQueue.execute(() -> {
blockerHeld.countDown();
try {
releaseBlocker.await(10, TimeUnit.SECONDS);
@@ -225,11 +225,11 @@ class ThreadPoolIsolationConfigTest {
}
});
assertTrue(blockerHeld.await(5, TimeUnit.SECONDS), "任务 1 占住一个信号量名额");
coze.execute(() -> {
throw new IllegalStateException("coze down");
taskQueue.execute(() -> {
throw new IllegalStateException("task queue down");
});
CountDownLatch afterFailure = new CountDownLatch(1);
coze.execute(afterFailure::countDown);
taskQueue.execute(afterFailure::countDown);
assertTrue(afterFailure.await(5, TimeUnit.SECONDS), "失败任务释放名额,后续任务可执行");
releaseBlocker.countDown();