Skip to content
bitzorcas
EN

Reference

后台任务构建块

Quartz.NET 后台任务调度 — 独立 JobHost 进程、基于 Cron 的调度、审计保留清理和多实例安全。

Last updated

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();

已注册任务

任务触发器用途
AuditRetentionQuartzJobCron(可配置)按保留策略定期清理审计日志记录

审计保留配置

{
"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);
});

添加新任务

  1. BitzOrcas.JobHost 中创建实现 IJob 的类
  2. Program.cs 中使用 AddJob<T>()AddTrigger() 注册
  3. 将 Cron 调度添加到配置
  4. 任务可以完全访问 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 名称