| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| Quartz.NET-3.17.1.zip | 2026-04-03 | 42.5 MB | |
| README.md | 2026-04-03 | 3.2 kB | |
| v3.17.1 source code.tar.gz | 2026-04-03 | 5.9 MB | |
| v3.17.1 source code.zip | 2026-04-03 | 6.6 MB | |
| Totals: 4 Items | 54.9 MB | 0 | |
Highlights
Jenkins-style H (hash) token for cron expressions
Quartz.NET now supports the H (hash) token in cron expressions, inspired by Jenkins. The H token resolves to a deterministic value based on the trigger's identity, spreading job execution times to avoid the thundering herd problem when many triggers share the same schedule.
Supported forms: H, H(min-max), H/step, H(min-max)/step
:::csharp
// Runs at a consistent but spread-out minute each hour
trigger = TriggerBuilder.Create()
.WithIdentity("myTrigger", "myGroup")
.WithCronSchedule("0 H * * * ?")
.Build();
// Runs every 15 minutes, starting at a hash-determined offset
trigger = TriggerBuilder.Create()
.WithIdentity("myTrigger", "myGroup")
.WithCronSchedule("0 H/15 * * * ?")
.Build();
The hash seed is automatically derived from the trigger's identity (name + group) when using TriggerBuilder, or can be provided explicitly. See the cron trigger documentation for full details.
Structured logging history plugins
New StructuredLoggingJobHistoryPlugin and StructuredLoggingTriggerHistoryPlugin provide first-class support for structured logging frameworks like Serilog and NLog. Unlike the existing logging plugins that use index-based format placeholders ({0}, {1}), these use named MEL-style message template parameters ({JobName}, {TriggerGroup}, etc.), making log output queryable in structured logging sinks and avoiding template cache memory leaks.
quartz.plugin.jobHistory.type = Quartz.Plugin.History.StructuredLoggingJobHistoryPlugin, Quartz.Plugins
quartz.plugin.triggerHistory.type = Quartz.Plugin.History.StructuredLoggingTriggerHistoryPlugin, Quartz.Plugins
Message templates are fully configurable via standard Quartz property configuration.
Bug Fixes
- Fix triggers getting permanently stuck in ACQUIRED state — Triggers could become permanently stuck if the scheduler crashed or was killed between acquiring a trigger and firing it. (#2980)
- Fix StoreCalendar overriding paused trigger state — Storing a calendar with
updateTriggers: trueno longer resets paused triggers back to normal state. (#2968) - Fix DoCheckin not retrying transient database errors — Cluster checkin now properly retries on transient database failures instead of silently failing. (#2970)
- Fix Dashboard
/_blazorendpoint conflict — The Quartz Dashboard no longer conflicts with host applications that also use Blazor. (#2975) - Fix spurious ERROR log on zombie transaction rollback — Rolling back a zombie transaction no longer logs a misleading ERROR. (#2978)
Full Changelog: https://github.com/quartznet/quartznet/compare/v3.17.0...v3.17.1