redb.Route.Quartz 4.7.0

Prefix Reserved
dotnet add package redb.Route.Quartz --version 4.7.0
                    
NuGet\Install-Package redb.Route.Quartz -Version 4.7.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="redb.Route.Quartz" Version="4.7.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="redb.Route.Quartz" Version="4.7.0" />
                    
Directory.Packages.props
<PackageReference Include="redb.Route.Quartz" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add redb.Route.Quartz --version 4.7.0
                    
#r "nuget: redb.Route.Quartz, 4.7.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package redb.Route.Quartz@4.7.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=redb.Route.Quartz&version=4.7.0
                    
Install as a Cake Addin
#tool nuget:?package=redb.Route.Quartz&version=4.7.0
                    
Install as a Cake Tool

redb.Route.Quartz

Quartz.NET scheduling transport for redb.Route. Cron-expression schedules and interval timers backed by the Quartz scheduler with thread pool management.

NuGet License: Apache 2.0

Installation

dotnet add package redb.Route.Quartz

Usage

Fluent DSL

using redb.Route.Quartz.Fluent;

// Cron schedule — every weekday at 8:00 AM
From(Cron.Schedule("daily-report", "0 0 8 ? * MON-FRI"))
    .Log("Running daily report")
    .To("direct://generate-report");

// Cron with thread pool
From(Cron.Schedule("batch-job", "0 */15 * * * ?").Threads(4))
    .To("direct://batch-process");

// Interval timer — every 5 seconds
From(QTimer.Every("heartbeat").Period(5000).Delay(1000))
    .SetBody(_ => new { status = "alive", time = DateTime.UtcNow })
    .To("direct://monitor");

// Fixed-rate timer
From(QTimer.Every("metrics").Period(10000).FixedRate().Threads(2))
    .To("direct://collect-metrics");

Fluent Builder API

Category Methods
Cron Cron.Schedule(name, expression), .Threads(int)
Timer QTimer.Every(name), .Period(ms), .Delay(ms), .FixedRate(), .Threads(int)

Two Schemes

Scheme Component Description
cron CronComponent Cron expression scheduling (e.g., 0 0 8 ? * MON-FRI)
qtimer QuartzTimerComponent Interval-based timer with optional initial delay

Both schemes are consumer-only — they generate messages on schedule.

Builder methods (Threads, Period, Delay) accept both constant values and IExpression for runtime resolution via the expression engine.

The scheduler of a context

As Apache Camel's QuartzComponent, each route context has one scheduler, created by its first cron:/qtimer: consumer — a context without such a route creates none:

  • an IScheduler handed to the context (context.AddService(typeof(IScheduler), scheduler)) is used as it is; its host owns it;
  • otherwise the context builds its own, from QuartzSchedulerOptions when the context or DI has them (store, cluster, serializer, thread pool), in memory without them, named {InstanceNamePrefix}-{context id}, and shuts it down when the context stops.

Either is started once the context has started — every consumer registered before the first fire (camel-quartz autoStartScheduler); a route started later in a running context starts it at once.

// A host shares the options, not a scheduler: every context gets its own, its own job namespace and, in a clustered
// store, a cluster of the nodes that run that context.
context.AddService(typeof(QuartzSchedulerOptions), new QuartzSchedulerOptions
{
    InstanceNamePrefix = "MyCluster",
    Properties = new Dictionary<string, string>
    {
        ["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",
        ["quartz.jobStore.clustered"] = "true",
        // dataSource, driverDelegateType, serializer, threadPool...
    },
});

A persistent store keys the scheduler by the context id, so the context needs a given id (new RouteContext("billing")): with a generated one the scheduler name would differ on every start and every node, and starting fails with a message.

One job, one consumer

The job key is {groupName}.{jobName} — redb and the endpoint path by default (cron://nightly → redb.nightly). It depends on the URI only, so it is the same after a restart and on every node of a cluster. On one scheduler a job key has one consumer: a second claimant — the same path with another schedule, cron://nightly beside qtimer://nightly, two contexts deliberately sharing one scheduler — fails at its start, naming both endpoints, instead of silently replacing the first one's schedule. Give it its own name: another path, or jobName= / groupName=.

A persistent or clustered store

The store is shared — with this node's next start, or with the other nodes of a cluster — so a node never decides about the schedule by itself:

  • stopping a route stops this node's consumer only; deleteJob / pauseJob apply to an in-memory store (a warning when set on a persistent one); pause or remove a schedule for the cluster explicitly;
  • a fire taken by a node that runs no consumer for it — a rolling upgrade, a route stopped on one node — is skipped and logged once; the job stays in the store (in memory it is cleaned up, it was the process's own);
  • nodes that share a scheduler name must carry the same schedules: separate roles get separate names. With a scheduler per context the cluster of a context is made of the nodes that run it;
  • .Cluster(true) on a Quartz route over a clustered store is a warning when a leader-only policy is attached: Quartz already fires a job on one node, and a leader-only route loses the fires the other nodes take. A host may decline the policy for Quartz routes (redb.Tsak does); the route then runs on every node.

Part of

redb.Route — ESB & EIP Framework for .NET

Tracing

On the redb.Route activity source (AddSource("redb.Route")), with redb.system = the scheme (cron, qtimer) and redb.route.endpoint: one Consumer span per fire, {scheme} receive. A fire carries no trace context, so the span is a root, never a child of the activity the scheduler thread holds; the route is its child. A failed route marks it an error; our own stop does not. RouteEngineOptions.EnableTelemetry = false opens none.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on redb.Route.Quartz:

Package Downloads
redb.Tsak.Core

Kernel of redb.Tsak — runtime container for redb.Route contexts. Provides hot-reload module loading, REST management API, scheduler, monitoring, security and pluggable cluster bootstrap.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
4.7.0 0 11/7/2026
4.6.2 61 11/5/2026
4.6.1 70 11/4/2026
4.6.0 95 11/3/2026
4.5.1 135 10/30/2026
4.5.0 125 10/29/2026
4.4.2 146 10/23/2026
4.4.1 134 10/21/2026
4.3.0 163 10/14/2026
4.2.3 108 10/8/2026
4.2.2 155 10/5/2026
4.2.0 164 9/30/2026
4.1.1 176 9/25/2026
4.1.0 170 9/21/2026
4.0.1 181 9/18/2026
4.0.0 188 9/11/2026
3.7.2 188 8/26/2026
3.7.1 200 8/26/2026
Loading failed