MinGo.Quartz.Agent
1.1.0
dotnet add package MinGo.Quartz.Agent --version 1.1.0
NuGet\Install-Package MinGo.Quartz.Agent -Version 1.1.0
<PackageReference Include="MinGo.Quartz.Agent" Version="1.1.0" />
<PackageVersion Include="MinGo.Quartz.Agent" Version="1.1.0" />
<PackageReference Include="MinGo.Quartz.Agent" />
paket add MinGo.Quartz.Agent --version 1.1.0
#r "nuget: MinGo.Quartz.Agent, 1.1.0"
#:package MinGo.Quartz.Agent@1.1.0
#addin nuget:?package=MinGo.Quartz.Agent&version=1.1.0
#tool nuget:?package=MinGo.Quartz.Agent&version=1.1.0
MinGo.Quartz.SDK — Quartz.NET 基础补强 + Agent SDK(L1 + L2 合并仓)
本仓合并了原 L1 MinGo.Quartz(Quartz.NET 基础补强 + 开放可观测性)与 L2 MinGo.Quartz.Agent(Agent SDK + 跨端共享契约)两层,所有包在同级目录下扁平组织。
依赖方向:MinGo.Quartz.Agent → MinGo.Quartz.Agent.Abstractions + MinGo.Quartz.OpenTelemetry → MinGo.Quartz → Quartz.NET + OpenTelemetry.Api。
项目构成
L1 — 基础补强 + 开放可观测性
| 项目 | 说明 |
|---|---|
src/MinGo.Quartz |
观测模型(SchedulerSnapshot/TriggerSnapshot/JobSnapshot/JobExecutionRecord)+ IQuartzObservabilityReader + 扩展点(Enricher/Filter/JobData 脱敏) |
src/MinGo.Quartz.OpenTelemetry |
OTel 集成:ActivitySource/Meter/ILogger,经 IJobListener/ITriggerListener/ISchedulerListener 自动埋点 |
tests/MinGo.Quartz.Tests |
核心读取器/脱敏/过滤/Enricher/DI 测试 |
tests/MinGo.Quartz.OpenTelemetry.Tests |
span/metric/脱敏/DI 集成测试 |
L2 — Agent SDK + 跨端共享契约
| 项目 | 说明 |
|---|---|
src/MinGo.Quartz.Agent.Abstractions |
契约包:DTO / 接口 / Attribute / 枚举 / Common(MinGoJsonDefaults、ApiResponse 解包、Result、Paged)。L3 Platform 只依赖本包 |
src/MinGo.Quartz.Agent |
Agent SDK:服务实现 + AddMinGoAgent() / UseMinGoAgent() / MapMinGoAgentApi() |
tests/MinGo.Quartz.Agent.Tests |
xUnit 单测/集成测试(RAMJobStore 真实 Scheduler) |
samples/Sample.Agent |
宿主示例(Quartz DI + RAMJobStore) |
samples/Sample.Jobs |
可复用 Job 库(带 [QuartzJob] / [JobParameter] 元数据) |
samples/Sample.PlatformStub |
极简 L3 风格平台桩(本地端到端验证注册/心跳/上报/日志) |
快速开始
仅使用 L1(可观测性)
// 1) 宿主注册 L1 服务(读取器 + 默认脱敏器)
services.AddMinGoQuartzOpenTelemetry(o =>
{
o.ActivitySourceName = "MinGo.Quartz";
o.MeterName = "MinGo.Quartz";
o.CaptureJobDataMap = true; // 把 JobData(脱敏后)写入 span
});
// 2) 对调度器挂载监听器(创建 scheduler 后、Start 前均可)
using var observability = MinGoQuartzObservability.Attach(scheduler, services);
// 3) 宿主侧接 OTel SDK(导出器由宿主决定)
builder.Services.AddOpenTelemetry()
.WithTracing(t => t.AddSource("MinGo.Quartz"))
.WithMetrics(m => m.AddMeter("MinGo.Quartz"));
使用 L2(Agent SDK,自动组合 L1)
var builder = WebApplication.CreateBuilder(args);
// Quartz(宿主自行注册 Scheduler;SDK 自动发现单例/集合/ISchedulerFactory)
builder.Services.AddQuartz(q =>
{
q.SchedulerName = "MyScheduler";
q.UseInMemoryStore();
});
builder.Services.AddQuartzHostedService(o => o.WaitForJobsToComplete = true);
// MinGo Agent(注册/心跳/上报 + 自动挂 L1 可观测监听器 + 执行日志监听器)
builder.AddMinGoAgent();
var app = builder.Build();
app.MapMinGoAgentApi(); // /api/agent/...
app.Run();
config.yaml(可选,SDK 自动加载):
agent:
heartbeatIntervalSeconds: 30
externalUrl: "http://localhost:5001"
platform:
url: "http://localhost:5256" # L3 Platform 地址
apiToken: "your-api-token"
Agent Minimal API(MapMinGoAgentApi,前缀默认 /api/agent)
GET /schedulers、GET /scheduler—— Scheduler 列表/默认状态GET/PUT/DELETE /jobs...—— Job 列表/详情/创建替换/更新/删除POST /jobs/{name}[/{group}]/trigger|pause|resume—— Job 级操作GET /manifest—— Agent 可调度 Job 清单(含参数元数据)
X-Scheduler-Name Header 或 ?schedulerName= 用于多 Scheduler 路由。
观测约定
- Span:
quartz.job.execute、quartz.trigger.fire、quartz.trigger.misfire、quartz.scheduler.lifecycle。 - Metric:
quartz.job.executions(counter)、quartz.job.duration(histogram)、quartz.trigger.fires/misfires(counter)、quartz.scheduler.executing.jobs(gauge)。 - 安全:JobDataMap 键含
password/token/secret/connectionstring/...时值替换为***(DefaultJobDataRedactor,默认开启)。
关键能力(L2 相对旧 MinGo.Qap.Agent 的补强)
- Misfire 闭环:
QuartzOptionsDto.MisfirePolicy按 Trigger 类型真实写入CronScheduleBuilder/SimpleScheduleBuilder;GetJobAsync从 Trigger 回读真实指令(ReadMisfirePolicy),不再写死FireAndProceed。 - 并发语义化:
DisallowConcurrentExecution/StoreDurable/RequestRecovery直接写入 JobDetail,而非仅 JobDataMap 标记。 - Trigger 级操作:pause / resume / unschedule 单 Trigger;Scheduler start / standby;Job interrupt。
- L1 组合:
AddMinGoAgent()内部调用AddMinGoQuartzOpenTelemetry(),SchedulerListenerAttacher在每个被发现的 Scheduler 上自动挂载 L1 观测监听器 + Agent 执行日志监听器。
构建与测试
正常 .NET 安装环境:dotnet build MinGo.Quartz.SDK.slnx。
本沙箱/精简环境请用 .\scripts\build.ps1 与 .\scripts\test.ps1(详见 scripts/README.md)。
依赖:Quartz 3.15.1、OpenTelemetry.Api 1.15.3、NSwag.AspNetCore 14.7.1、YamlDotNet 16.3.0;目标框架 net10.0(后续可多目标 net8.0)。
里程碑状态
L1
| 里程碑 | 状态 |
|---|---|
| M1 数据模型 + 读取器 | ✅ 8/8 测试通过 |
| M2 扩展点(Enricher/Redactor/Filter) | ✅ |
| M3 OpenTelemetry 埋点 | ✅ 4/4 测试通过 |
| M4 打包与文档 | ✅ MinGo.Quartz 1.0.0 / MinGo.Quartz.OpenTelemetry 1.0.0 |
L2
| 里程碑 | 状态 |
|---|---|
| M1 Abstractions 契约迁移 | ✅ 编译 + JobKeyDto/JobTypeQualifiedName 单测 21/21 |
| M2 Agent SDK 迁移 + L1 组合 | ✅ Sample.Agent 启动:注册/心跳/Scheduler 上报/日志上传 E2E 通过 |
| M3 补强(Misfire/并发/Trigger 级操作) | ✅ 单测/集成测试 51/51 |
| M4 打包与文档 | ✅ MinGo.Quartz.Agent.Abstractions 1.0.0 / MinGo.Quartz.Agent 1.0.0(依赖 L1 1.0.0) |
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- MinGo.Quartz.Agent.Abstractions (>= 1.1.0)
- MinGo.Quartz.OpenTelemetry (>= 1.1.0)
- NSwag.AspNetCore (>= 14.7.1)
- Quartz (>= 3.15.1)
- YamlDotNet (>= 16.3.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.