10b51eb08a57d32b03c67fdfcd949edad3924aed
1
Commits
-
参照现有的 ExamArrangementJob / SchedulePublishJob 后台任务模式,将发布改为通过 RabbitMQ
队列异步执行,拆分查询消除笛卡尔积。 修改的文件(共 13 个) ┌───────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────┐ │ 文件 │ 变更 │ ├───────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────┤ │ Domain/Academic/ExamEntities.cs │ 新增 ExamPublishJob 实体 + ExamPublishJobStatus │ │ │ / ExamPublishJobKind 枚举 │ ├───────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────┤ │ Domain/System/BackgroundJobOutboxMessage.cs │ BackgroundJobKind 新增 ExamPublish = 6 │ ├───────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────┤ │ Infrastructure/BackgroundJobs/BackgroundJobOptions.cs │ 新增 ExamPublishConcurrency 配置项 │ ├───────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────┤ │ Infrastructure/BackgroundJobs/BackgroundJobRunner.cs │ RunAsync 和 MarkJobRetryLimitExceeded 添加 │ │ │ ExamPublish 分支 │ ├───────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────┤ │ Infrastructure/BackgroundJobs/RabbitMqBackgroundJobs.cs │ JobKinds 数组和 RoutingKey 添加 ExamPublish → │ │ │ "exam.publish" │ ├───────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────┤ │ Infrastructure/BackgroundJobs/BackgroundJobOutboxPublisher.cs │ 启动恢复逻辑添加 ExamPublishJobs │ ├───────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────┤ │ Infrastructure/Persistence/AppDbContext.cs │ 新增 ExamPublishJobs DbSet │ ├───────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────┤ │ Controllers/OperationsController.cs │ CountFailedJobsAsync / GetFailedJobs │ │ │ 添加考试发布失败统计和筛选 │ ├───────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────┤ │ Program.cs │ 校验 ExamPublishConcurrency + 注册 │ │ │ ExamPublishJobProcessor │ ├───────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────┤ │ Infrastructure/Exams/ExamPublishJobs.cs │ 新文件 — │ │ │ ExamPublishJobProcessor,拆分查询校验后发布 │ ├───────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────┤ │ Controllers/ExamsController.cs │ Publish 改为创建后台任务 + 202 返回;新增 GET │ │ │ publish-jobs/{id} / GET plans/{id}/publish-job │ ├───────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────┤ │ Controllers/MakeupExamsController.cs │ 同上改造 │ ├───────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────┤ │ tests/.../TeachingWorkflowRosterTests.cs │ 更新测试适配新的异步发布模式 │ └───────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────┘ 笛卡尔积消除 之前:一个 Include 链拉全部 → EF Core 生成 Sessions × Invigilators × RoomLinks × Seats 笛卡尔积 之后: - 场次计数:db.ExamSessions.CountAsync(无 JOIN) - 场次摘要:Select new { Id, ClassroomId, InvigilatorCount, RoomLinkCount }(只查所需列) - 容量超限:db.ExamRooms.Select(r => new { SeatCount = r.Seats.Count, Capacity })(单表 JOIN) - 课程冲突:db.ExamRoomSessions.Where(link => ...CourseId != link.ExamRoom!.CourseId)(独立查询) - 每个查询只做自己需要的 JOIN,互不干扰 测试结果 213 通过,0 失败,0 跳过 配置方式 - BackgroundJobs__Transport=RabbitMq → 走 RabbitMQ 队列 jiaowu.background-jobs.exam.publish - BackgroundJobs__Transport=InMemory(默认) → 走内存 Channel - BackgroundJobs__ExamPublishConcurrency=1(默认,可调 1-16)biss
2026-07-28 08:10:22 +08:00