BitzOrcas 使用 Quartz.NET 在独立 JobHost 进程中运行后台任务。这保持 API 宿主的裁剪安全和 AOT 兼容性。
架构
┌──────────────────┐ ┌──────────────────┐│ API 宿主 │ │ JobHost ││ (AOT, 已裁剪) │ │ (未裁剪) ││ │ │ ││ 无 Quartz │ │ Quartz.NET ││ 无 CAP 消费者 │ │ SqlSugar 审计 │└────────┬─────────┘ └────────┬─────────┘ │ │ └────────────┬───────────┘ ▼ SQL Server (共享数据库)已注册任务
| 任务 | 触发器 | 用途 |
|---|---|---|
AuditRetentionQuartzJob | Cron(可配置) | 按保留策略清理旧审计记录 |
Quartz 配置
{ "Audit": { "Retention": { "Enabled": true, "CronExpression": "0 0 2 * * ?", "MaxAgeDays": 90 } }}JobHost 组成
JobHost 是最小化的——仅包含调度工作所需:
Host.CreateApplicationBuilder(args) // 时钟 + 审计管道 .AddBitzOrcasAuditDefaults() .AddBitzOrcasAuditPipeline() // SqlSugar(如果配置了连接) .AddBitzOrcasSqlSugar() .AddBitzOrcasSqlSugarAuditStore() // Quartz 调度 .AddQuartz(configure) .AddQuartzHostedService() // OTel + 健康检查 .AddServiceDefaults()任务的租户上下文
后台任务没有 HTTP 上下文。对于租户范围操作:
await currentUserAccessor.BeginScopeAsync(userId, tenantId, async () =>{ // 此代码以指定用户/租户身份运行});添加新任务
- 在
BitzOrcas.JobHost/中创建实现IJob的类 - 在
Program.cs中注册:
q.AddJob<MyNewJob>(opts => opts.WithIdentity("my-job"));q.AddTrigger(opts => opts .ForJob("my-job") .WithCronSchedule("0 0 */6 * * ?")); // 每 6 小时另见
- 后台任务构建块 — 详细基础设施参考