BitzOrcas 使用 Quartz.NET 进行后台任务调度,运行在独立 JobHost 进程中,以保持 API 宿主的 AOT 兼容性和裁剪安全。
架构
┌───────────────────────┐ ┌───────────────────────┐│ API 宿主 │ │ JobHost ││ (已裁剪, AOT 安全) │ │ (非裁剪 Worker) ││ │ │ ││ 无 Quartz 引用 │ │ Quartz.NET ││ 无 CAP 消费者 │ │ SqlSugar 审计存储 ││ 无后台任务 │ │ CAP 消费者 │└───────────┬───────────┘ └───────────┬───────────┘ │ │ └─────────────┬───────────────┘ ▼ ┌─────────────┐ │ SQL Server │ │ (共享) │ └─────────────┘JobHost 组成
JobHost(BitzOrcas.JobHost)是一个最小化的 .NET Worker 服务:
var builder = Host.CreateApplicationBuilder(args);
// 时钟 + 审计管道builder.Services.AddSingleton<IAppClock, SystemClock>();builder.Services.AddBitzOrcasAuditDefaults();builder.Services.AddBitzOrcasAuditPipeline();
// SqlSugar + 审计存储(如果配置了连接字符串)builder.Services.AddBitzOrcasSqlSugar(opt => opt.ConnectionString = connectionString);builder.Services.AddBitzOrcasSqlSugarAuditStore();
// Quartz 调度builder.Services.AddQuartz(q =>{ var retentionOptions = new AuditPersistenceOptions(); builder.Configuration.GetSection("Audit").Bind(retentionOptions);
if (retentionOptions.Retention.Enabled) { var jobKey = new JobKey("audit-retention"); q.AddJob<AuditRetentionQuartzJob>(opts => opts.WithIdentity(jobKey)); q.AddTrigger(opts => opts .ForJob(jobKey) .WithCronSchedule(retentionOptions.Retention.CronExpression)); }});builder.Services.AddQuartzHostedService(opt => opt.WaitForJobsToComplete = true);
// OpenTelemetry + 健康检查(与 API 宿主共享)builder.AddServiceDefaults();已注册任务
| 任务 | 触发器 | 用途 |
|---|---|---|
AuditRetentionQuartzJob | Cron(可配置) | 按保留策略定期清理审计日志记录 |
审计保留配置
{ "Audit": { "Retention": { "Enabled": true, "CronExpression": "0 0 2 * * ?", // 每天凌晨 2 点 "MaxAgeDays": 90 } }}任务在租户上下文中的身份
JobHost 没有 HTTP 上下文,因此默认使用 AnonymousCurrentUser。对于需要租户范围操作的任务:
// 使用 ICurrentUserAccessor.BeginScope 临时设置用户上下文await currentUserAccessor.BeginScopeAsync(userId, tenantId, async () =>{ // 任务代码以指定用户/租户身份运行 await auditStore.CleanupAsync(tenantId, cutoffDate);});添加新任务
- 在
BitzOrcas.JobHost中创建实现IJob的类 - 在
Program.cs中使用AddJob<T>()和AddTrigger()注册 - 将 Cron 调度添加到配置
- 任务可以完全访问 SqlSugar 仓库和审计管道
ServiceDefaults 共享基础设施
API 宿主和 JobHost 共享相同的 BitzOrcas.ServiceDefaults:
- OpenTelemetry — 通过 OTLP 导出器的 traces + metrics
- 健康检查 — 存活/就绪探针
- 资源属性 — service.name、service.version、deployment.environment
程序集参考
BitzOrcas.JobHost├── Program.cs → 宿主设置 + Quartz 注册├── AuditRetentionQuartzJob.cs → 审计保留清理任务└── BitzOrcas.JobHost.csproj → Worker SDK + Quartz 包
BitzOrcas.ServiceDefaults├── Extensions/ServiceDefaultsExtensions.cs → AddServiceDefaults()└── Extensions/BitzOrcasActivitySources.cs → 自定义 ActivitySource 名称