Download Latest Version Quartz.NET-3.18.2.zip (48.6 MB)
Email in envelope

Get an email when there's a new version of Quartz.NET

Home / v3.17.0
Name Modified Size InfoDownloads / Week
Parent folder
README.md 2026-03-29 10.2 kB
v3.17.0 source code.tar.gz 2026-03-29 5.9 MB
v3.17.0 source code.zip 2026-03-29 6.5 MB
Totals: 3 Items   12.4 MB 0

This 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_TIME column

A new optional column MISFIRE_ORIG_FIRE_TIME on QRTZ_TRIGGERS enables correct ScheduledFireTimeUtc for misfired triggers when using "fire now" misfire policies. Without it, ScheduledFireTimeUtc equals FireTimeUtc for misfired triggers (the pre-existing behavior). RAMJobStore does not require this migration.

Migration script: database/schema_30_add_misfire_orig_fire_time.sql (github.com) (covers SQL Server, PostgreSQL, MySQL, SQLite, Oracle, Firebird)

Clustering and concurrency fixes

  • Fix DisallowConcurrentExecution jobs running simultaneously in cluster (#2697)
  • Fix false cluster recovery causing DisallowConcurrentExecution violation (#2915)
  • Fix triggers stuck in BLOCKED state for DisallowConcurrentExecution jobs (#2822)
  • Fix FIRED_TRIGGERS not cleaned up on job deletion mid-execution (#1696)
  • Handle transient database exceptions (deadlocks) with automatic retry (#2883, [#2952])
  • Fix PostgreSQL transaction abort error on lock contention (#2884)
  • Fix SQLite "database is locked" errors with dedicated semaphore (#2323)
  • Add MySQL FORCE INDEX hints for slow trigger acquisition queries (#547)

Trigger state and fire time accuracy

  • Fix GetTriggerState returning Complete instead of Blocked for executing triggers (#2255)
  • Fix RAMJobStore.TriggersFired skipping triggers causing wrong trigger/job execution (#1386)
  • Fix ScheduledFireTimeUtc returning wrong value after misfire (#2899)
  • Fix PreviousFireTimeUtc reset to null on restart with OverWriteExistingData=true (#1834)
  • Fix SimpleTrigger first fire time wrong when created long before scheduling (#2455)
  • Fix CronTrigger double-firing when rescheduled with old StartTimeUtc (#2909)
  • Fix recovery trigger missing original JobData (#2083)
  • Fix misfired blocked triggers not being deleted from database (#1646)
  • Fix DoNothing misfire policy skipping fire times within threshold (#2912)

DST and time handling

  • Fix DailyTimeIntervalTrigger extra fire during DST fall-back (#2917)
  • Fix DailyTimeIntervalTrigger mutating StartTimeUtc during fire time computation (#2906)
  • Fix DailyTimeIntervalTrigger RepeatCount to apply per day (#1633)
  • Fix scheduler thread stuck after system clock jumps backward (#1508)
  • Fix ComputeFireTimesBetween modifying trigger StartTimeUtc (#2722)

Scheduler lifecycle and threading

  • Fix scheduler hang on shutdown: replace Monitor.Wait with async SemaphoreSlim (#2877)
  • Fix shutdown deadlock (#2830)
  • Release acquired triggers on shutdown instead of leaking them (#2881)
  • Fix DedicatedThreadPool threads leaking on scheduler shutdown (#1357)
  • Use dedicated thread for scheduler loop to prevent missed triggers under high CPU (#781)

Job execution

  • Fix RefireImmediately with JobChainingJobListener firing chain prematurely (#663)
  • Fix AsyncLocal flow from IJobFactory.NewJob to IJob.Execute (#1528)
  • Add IJobDetail property to JobExecutionException (#1442)

API and configuration

  • Fix idleWaitTime of zero silently ignored instead of throwing (#1394)
  • Fix AddJob/AddTrigger ambiguous references without removing overloads (#2795)
  • Fix PauseJobs/ResumeJob interaction bug in RAMJobStore (#761)
  • Fix RemoteScheduler ignoring local quartz.scheduler.instanceName (#313)
  • Restore DB trigger fields for custom (blob) triggers (#2949)

Dashboard

  • Fix dashboard CSS 404 in API-only projects (#2886)

What's Changed

Full Changelog: https://github.com/quartznet/quartznet/compare/v3.16.1...v3.17.0

Source: README.md, updated 2026-03-29