Update dependency Quartz.AspNetCore to 3.18.0#1742
Open
renovate[bot] wants to merge 1 commit intomainfrom
Open
Update dependency Quartz.AspNetCore to 3.18.0#1742renovate[bot] wants to merge 1 commit intomainfrom
renovate[bot] wants to merge 1 commit intomainfrom
Conversation
8255ff6 to
22cf21b
Compare
22cf21b to
eeb6835
Compare
eeb6835 to
37f2743
Compare
37f2743 to
996e34a
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
3.15.1→3.18.0Release Notes
quartznet/quartznet (Quartz.AspNetCore)
v3.18.0Quartz.NET 3.18.0 is a major feature release with 8 new capabilities, performance improvements, and important bug fixes.
New Features
RFC 5545 RRULE recurrence trigger
Quartz.NET now supports scheduling with iCalendar recurrence rules (RFC 5545 RRULE), enabling complex patterns that cannot be expressed with cron expressions — such as "2nd Monday of every month" or "last weekday of March each year."
A custom lightweight RRULE engine (~1.5K LOC) handles all frequencies (YEARLY through SECONDLY), all BY* rules (BYDAY, BYMONTHDAY, BYSETPOS, etc.), COUNT, UNTIL, INTERVAL, and WKST. No new external dependencies. No database schema changes — uses the existing SIMPROP_TRIGGERS table.
FREQ=MONTHLY;BYDAY=2MOFREQ=WEEKLY;INTERVAL=2;BYDAY=MO,WE,FRFREQ=YEARLY;BYMONTH=3;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1FREQ=MONTHLY;BYMONTHDAY=-1FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR(#2990) — Closes #1259
Execution groups for per-node thread limits
Tag triggers with an execution group to limit how many threads a category of jobs can consume concurrently on each node. This prevents resource-intensive jobs from starving lightweight work.
Also configurable via properties (
quartz.executionLimit.batch-jobs = 2) and runtime API (scheduler.SetExecutionLimits(...)). Includes optionalEXECUTION_GROUPcolumn for ADO.NET job stores with graceful fallback when absent, and Dashboard integration.(#3004) — Closes #1175, #830
Multiple named schedulers in Microsoft DI
Register multiple independent scheduler instances in a single DI container. Each named scheduler gets isolated options, jobs, triggers, listeners, and calendars.
AddQuartzHostedService()automatically manages the lifecycle of all registered schedulers.(#3000) — Closes #2109
JSON configuration and scheduling data
Configure Quartz.NET using hierarchical JSON in
appsettings.jsoninstead of flat property keys. Supports declarative job and trigger definitions, all 4 trigger types, and named schedulers via aSchedulerssection.{ "Quartz": { "Scheduler": { "InstanceName": "My Scheduler" }, "ThreadPool": { "MaxConcurrency": 10 }, "Schedule": { "Jobs": [{ "Name": "myJob", "JobType": "MyApp.Jobs.MyJob, MyApp", "Durable": true }], "Triggers": [{ "Name": "myTrigger", "JobName": "myJob", "Cron": { "Expression": "0/30 * * * * ?" } }] } } }Also includes a standalone
JsonSchedulingDataProcessorPluginforquartz_jobs.jsonfile support with hot-reload, mirroringXMLSchedulingDataProcessorPlugin.(#3012, #3015, #3017) — Closes #1755
Redis-based distributed lock handler (new
Quartz.Redispackage)New
Quartz.RedisNuGet package providingRedisSemaphore— anISemaphoreimplementation using RedisSET NX PXdistributed locks instead of database row locks. This eliminates DB row lock contention and deadlocks in clustered setups while keeping job/trigger data in the relational database.Uses two-tier locking: local
SemaphoreSlimprevents redundant Redis round-trips within the same process, and a Lua script ensures atomic check-and-delete on release for safety.(#2999) — Closes #1625
Activity tracing for ADO.NET job store operations
28
IJobStoremethods are now wrapped withSystem.Diagnostics.Activityspans, so database calls appear as children of named Quartz operations (e.g.,Quartz.JobStore.AcquireNextTriggers) instead of orphaned root spans in your tracing system. Zero overhead when tracing is disabled.All new operations are automatically included in
QuartzInstrumentationOptions.DefaultTracedOperations.(#3001) — Closes #2721
UpdateTriggerDetails — update trigger metadata without rescheduling
New
UpdateTriggerDetailsmethod updates Description, Priority, JobDataMap, CalendarName, and MisfireInstruction on an existing trigger without resetting fire times, trigger state, or misfire context. Available viaIScheduler.UpdateTriggerDetails()extension method.(#2988) — Closes #844
Factory-based
AddQuartz()withIServiceProvideraccessNew
AddQuartzoverloads acceptingAction<IServiceCollectionQuartzConfigurator, IServiceProvider>allow resolving DI services during Quartz configuration — useful for obtaining connection strings, feature flags, or other configuration from DI-registered services.(#3007) — Closes #1617
Performance
Reduced DB round-trips in misfire recovery
Misfire recovery now uses a targeted
UPDATEinstead of routing each trigger through the fullStoreTriggerpath, reducing per-trigger DB round-trips from 7-12 down to 1-2 (~87% reduction). For a batch of 20 cron triggers, this drops from ~150 queries to ~20 queries — all underLockTriggerAccess. Calendar lookups are also cached across the batch.(#2993) — Closes #758
Bug Fixes
SemaphoreSlim(0, 1)inQuartzSchedulerThreadcould silently drop scheduling signals viaSemaphoreFullException, causing triggers to stay stuck in WAITING state until the next idle loop timeout. (#3033) — Fixes #3028SchedulerRepositoryindexed by scheduler name only, preventing multiple remote proxies to different nodes in the same cluster from coexisting. Now supports instance-aware lookup. (#2991) — Fixes #388IsJobGroupPaused/IsTriggerGroupPausedin ADO.NET job store — These methods previously threwNotImplementedExceptionin the persistent job store. (#3030)ServiceProvider— Dashboard plugins no longer rely on a staticServiceProviderreference, fixing issues with multiple host instances. (#3035) — Fixes #3026Deprecations
DirtyFlagMap.Get()— use the indexer (map[key]) instead (#2986)DirtyFlagMap.Put()/PutAll()— use the indexer or collection initializer instead (#2989)What's Changed
Full Changelog: quartznet/quartznet@v3.17.1...v3.18.0
v3.17.1Highlights
Jenkins-style H (hash) token for cron expressions
Quartz.NET now supports the
H(hash) token in cron expressions, inspired by Jenkins. TheHtoken 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)/stepThe 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
StructuredLoggingJobHistoryPluginandStructuredLoggingTriggerHistoryPluginprovide 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.Message templates are fully configurable via standard Quartz property configuration.
Bug Fixes
updateTriggers: trueno longer resets paused triggers back to normal state. (#2968)/_blazorendpoint conflict — The Quartz Dashboard no longer conflicts with host applications that also use Blazor. (#2975)Full Changelog: quartznet/quartznet@v3.17.0...v3.17.1
v3.17.0This is a major bug-fix release with 40+ fixes spanning trigger state management, clustering reliability, DST handling, misfire accuracy, and scheduler lifecycle. An optional database schema migration improves misfire handling.
Highlights
Optional database migration:
MISFIRE_ORIG_FIRE_TIMEcolumnA new optional column
MISFIRE_ORIG_FIRE_TIMEonQRTZ_TRIGGERSenables correctScheduledFireTimeUtcfor misfired triggers when using "fire now" misfire policies. Without it,ScheduledFireTimeUtcequalsFireTimeUtcfor misfired triggers (the pre-existing behavior). RAMJobStore does not require this migration.Migration script:
database/schema_30_add_misfire_orig_fire_time.sql(covers SQL Server, PostgreSQL, MySQL, SQLite, Oracle, Firebird)Clustering and concurrency fixes
DisallowConcurrentExecutionjobs running simultaneously in cluster (#2697)DisallowConcurrentExecutionviolation (#2915)DisallowConcurrentExecutionjobs (#2822)FIRED_TRIGGERSnot cleaned up on job deletion mid-execution (#1696)Trigger state and fire time accuracy
GetTriggerStatereturning Complete instead of Blocked for executing triggers (#2255)RAMJobStore.TriggersFiredskipping triggers causing wrong trigger/job execution (#1386)ScheduledFireTimeUtcreturning wrong value after misfire (#2899)PreviousFireTimeUtcreset to null on restart withOverWriteExistingData=true(#1834)SimpleTriggerfirst fire time wrong when created long before scheduling (#2455)CronTriggerdouble-firing when rescheduled with oldStartTimeUtc(#2909)JobData(#2083)DoNothingmisfire policy skipping fire times within threshold (#2912)DST and time handling
DailyTimeIntervalTriggerextra fire during DST fall-back (#2917)DailyTimeIntervalTriggermutatingStartTimeUtcduring fire time computation (#2906)DailyTimeIntervalTriggerRepeatCountto apply per day (#1633)ComputeFireTimesBetweenmodifying trigger StartTimeUtc (#2722)Scheduler lifecycle and threading
Monitor.Waitwith asyncSemaphoreSlim(#2877)DedicatedThreadPoolthreads leaking on scheduler shutdown (#1357)Job execution
RefireImmediatelywithJobChainingJobListenerfiring chain prematurely (#663)AsyncLocalflow fromIJobFactory.NewJobtoIJob.Execute(#1528)IJobDetailproperty toJobExecutionException(#1442)API and configuration
idleWaitTimeof zero silently ignored instead of throwing (#1394)AddJob/AddTriggerambiguous references without removing overloads (#2795)PauseJobs/ResumeJobinteraction bug in RAMJobStore (#761)RemoteSchedulerignoring localquartz.scheduler.instanceName(#313)Dashboard
What's Changed
Full Changelog: quartznet/quartznet@v3.16.1...v3.17.0
v3.16.1: Quartz.NET 3.16.1This release hopefully fixes the hiccup we had with the versioning/packaging of the new Dashboard package.
What's Changed
Full Changelog: quartznet/quartznet@v3.16.0...v3.16.1
v3.16.0: Quartz.NET 3.16.0On top of great community fixes, this release also brings the experimental Dashboard into action. You can enable it on NET 8 and later, see documentation for details.
What's Changed
CalendarIntervalTriggerImplby @jafin in #2837Full Changelog: quartznet/quartznet@v3.15.1...v3.16.0
Configuration
📅 Schedule: (in timezone Asia/Shanghai)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.