fix(M-AI-04): WorkerModule 缺失 AiJobModule 导致 Worker 启动超时
Some checks failed
Deploy API Server / build-and-unit (push) Successful in 36s
Deploy API Server / current-integration (push) Failing after 1m35s
Deploy API Server / backward-compat (push) Successful in 0s
Deploy API Server / deploy (push) Has been skipped

根因: WorkerModule 未导入 AiJobModule,导致 OutboxDispatcher 的
依赖 OutboxRepository 在 DI 容器中不可用,Worker 进程启动时 hang。

修复:
1. WorkerModule 导入 AiJobModule -- 提供 OutboxRepository 等共享依赖
2. ActiveRecallRegistrationService 容忍 DuplicateJobTypeError --
   API 和 Worker 各自独立启动时均会注册 active_recall definition,
   第二次注册安全跳过(不阻止进程启动)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
wangdl 2026-06-21 15:04:13 +08:00
parent 0ec58669dd
commit b952f5eefb
2 changed files with 26 additions and 11 deletions

View File

@ -1,14 +1,16 @@
import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
import { JobDefinitionRegistry } from './job-definition-registry'; import { JobDefinitionRegistry, DuplicateJobTypeError } from './job-definition-registry';
import { ACTIVE_RECALL_JOB_DEFINITION } from './active-recall-job-definition'; import { ACTIVE_RECALL_JOB_DEFINITION } from './active-recall-job-definition';
/** /**
* M-AI-04-02: Active Recall Definition * M-AI-04-02: Active Recall Definition
* *
* onModuleInit JobDefinitionRegistry * onModuleInit JobDefinitionRegistry
* ActiveRecall JobDefinition * ActiveRecall JobDefinition
* *
* Registry DuplicateJobTypeError fail-fast * API Worker
* AiJobModule Definition
* DuplicateJobTypeError
*/ */
@Injectable() @Injectable()
export class ActiveRecallRegistrationService implements OnModuleInit { export class ActiveRecallRegistrationService implements OnModuleInit {
@ -17,6 +19,7 @@ export class ActiveRecallRegistrationService implements OnModuleInit {
constructor(private readonly registry: JobDefinitionRegistry) {} constructor(private readonly registry: JobDefinitionRegistry) {}
onModuleInit(): void { onModuleInit(): void {
try {
this.registry.register(ACTIVE_RECALL_JOB_DEFINITION); this.registry.register(ACTIVE_RECALL_JOB_DEFINITION);
this.logger.log( this.logger.log(
`Active Recall Job Definition registered: ` + `Active Recall Job Definition registered: ` +
@ -25,5 +28,15 @@ export class ActiveRecallRegistrationService implements OnModuleInit {
`timeout=${ACTIVE_RECALL_JOB_DEFINITION.execution.timeoutMs}ms ` + `timeout=${ACTIVE_RECALL_JOB_DEFINITION.execution.timeoutMs}ms ` +
`retries=${ACTIVE_RECALL_JOB_DEFINITION.execution.maxRetries}`, `retries=${ACTIVE_RECALL_JOB_DEFINITION.execution.maxRetries}`,
); );
} catch (err: unknown) {
if (err instanceof DuplicateJobTypeError) {
this.logger.log(
`Active Recall Job Definition already registered ` +
`(by another process — e.g. API + Worker both import AiJobModule)`,
);
} else {
throw err;
}
}
} }
} }

View File

@ -21,6 +21,7 @@ import { WorkerHeartbeatService } from './workers/worker-heartbeat.service';
import { OutboxDispatcher } from './modules/ai-job/outbox-dispatcher.service'; import { OutboxDispatcher } from './modules/ai-job/outbox-dispatcher.service';
import { AiAnalysisModule } from './modules/ai-analysis/ai-analysis.module'; import { AiAnalysisModule } from './modules/ai-analysis/ai-analysis.module';
import { AiJobModule } from './modules/ai-job/ai-job.module';
import { DocumentImportModule } from './modules/document-import/document-import.module'; import { DocumentImportModule } from './modules/document-import/document-import.module';
import { KnowledgeItemsModule } from './modules/knowledge-items/knowledge-items.module'; import { KnowledgeItemsModule } from './modules/knowledge-items/knowledge-items.module';
import { NotificationsModule } from './modules/notifications/notifications.module'; import { NotificationsModule } from './modules/notifications/notifications.module';
@ -66,6 +67,7 @@ import appleConfig from './config/apple.config';
StorageModule, StorageModule,
LoggerModule, LoggerModule,
AiAnalysisModule, AiAnalysisModule,
AiJobModule,
DocumentImportModule, DocumentImportModule,
KnowledgeItemsModule, KnowledgeItemsModule,
NotificationsModule, NotificationsModule,