Table of Contents

Class RAMJobStore

Namespace
Quartz.Impl
Assembly
Quartz.dll

This class implements a IJobStore that utilizes RAM as its storage device.

As you should know, the ramification of this is that access is extremely fast, but the data is completely volatile - therefore this IJobStore should not be used if true persistence between program shutdowns is required.

public sealed class RAMJobStore : IJobStore
Inheritance
RAMJobStore
Implements
Inherited Members

Constructors

RAMJobStore(ILoggerFactory, ISchedulerSignaler, TimeProvider)

Initializes a new instance of the RAMJobStore class.

public RAMJobStore(ILoggerFactory loggerFactory, ISchedulerSignaler signaler, TimeProvider timeProvider)

Parameters

loggerFactory ILoggerFactory
signaler ISchedulerSignaler
timeProvider TimeProvider

Properties

Clustered

Whether the IJobStore implementation is clustered.

public bool Clustered { get; }

Property Value

bool

Remarks

Read-only, because being clustered is something a store is rather than something it is told: the ADO.NET store reports what Enabled says, and a store that cannot cluster answers false and means it.

EstimatedTimeToReleaseAndAcquireTrigger

How long the IJobStore implementation estimates that it will take to release a trigger and acquire a new one.

public TimeSpan EstimatedTimeToReleaseAndAcquireTrigger { get; }

Property Value

TimeSpan

MisfireThreshold

Gets or sets the time by which a trigger must have missed its next-fire-time, in order for it to be considered "misfired" and thus have its misfire instruction applied.

[TimeSpanParseRule(TimeSpanParseRule.Milliseconds)]
public TimeSpan MisfireThreshold { get; }

Property Value

TimeSpan

The time by which a trigger must have missed its next-fire-time, in order for it to be considered "misfired" and thus have its misfire instruction applied. The default is 5 seconds.

Exceptions

ArgumentException

value represents less than one millisecond.

SupportsPersistence

Returns whether this instance supports persistence.

public bool SupportsPersistence { get; }

Property Value

bool

SupportsStoringPaused

Whether the store honours Paused and Paused, storing a trigger paused in the operation that stores it.

public bool SupportsStoringPaused { get; }

Property Value

bool

Remarks

A default interface member, added in 4.4, answering false. A store that answers so is handed Replace alone, as before 4.4, and the scheduler then pauses each trigger through PauseTriggerWith(TriggerKey, PauseDetails?, CancellationToken), so a trigger due at once can fire in between. Answer true once AddTrigger(IOperableTrigger, AddTriggerOptions, CancellationToken) and ScheduleJobs(IReadOnlyDictionary<IJobDetail, IReadOnlyCollection<IOperableTrigger>>, ScheduleJobOptions, CancellationToken) honour the option. Every store Quartz ships does.

Methods

AcquireNextTriggers(TriggerAcquisitionRequest, CancellationToken)

Get a handle to the next trigger to be fired, and mark it as 'reserved' by the calling scheduler.

public ValueTask<List<IOperableTrigger>> AcquireNextTriggers(TriggerAcquisitionRequest request, CancellationToken cancellationToken = default)

Parameters

request TriggerAcquisitionRequest

What to acquire: the cut-off time, how many, the batching window and the per-execution-group capacity still available.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<List<IOperableTrigger>>

The acquired triggers. The caller copies this list rather than taking it over, so it may be one the store keeps.

Remarks

The returned list stays the store's. The scheduler's acquisition loop copies it before working with it, because it removes entries from its own copy while it waits out the first trigger's fire time and would otherwise be editing something the store still holds. A store is therefore free to hand back a list it keeps a reference to, or to reuse one between calls; it does not have to build a fresh list to be safe. The copy costs the scheduler around ten nanoseconds and sixty-four bytes per acquisition attempt (AcquiredTriggerHandoffBenchmark), against an attempt that is a database round trip, and is kept in preference to a caller-owns rule that every store would have to keep and that would break silently in one that did not (#3344).

See Also

AcquireNextTriggersAndFireDue(TriggerAcquisitionRequest, CancellationToken)

Acquires the next triggers to be fired, as AcquireNextTriggers(TriggerAcquisitionRequest, CancellationToken) does, and fires the ones already due in the same operation. This is the member the scheduler calls.

public ValueTask<TriggerAcquisitionResult> AcquireNextTriggersAndFireDue(TriggerAcquisitionRequest request, CancellationToken cancellationToken = default)

Parameters

request TriggerAcquisitionRequest

What to acquire, as for AcquireNextTriggers(TriggerAcquisitionRequest, CancellationToken).

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<TriggerAcquisitionResult>

What was acquired, and what became of the triggers fired as they were.

Remarks

A trigger is due when its NextFireTimeUtc is at or before the store's clock when it acquires it. The store fires those as TriggersFired(IReadOnlyCollection<IOperableTrigger>, CancellationToken) would and answers them in Due and Fired; the rest, due later within the batch window, are Pending, which the scheduler waits for and fires with TriggersFired(IReadOnlyCollection<IOperableTrigger>, CancellationToken). A persistent store saves the second transaction a round of already-due triggers used to cost.

A default interface member, so a store written against an earlier 4.x keeps working. The default fires nothing: it calls AcquireNextTriggers(TriggerAcquisitionRequest, CancellationToken) and answers everything as pending, which is exactly what the scheduler did with that answer before. A new name rather than an overload, because PublicApiGenerator marks default implementations per method name.

AddCalendar(string, ICalendar, AddCalendarOptions, CancellationToken)

Store the given ICalendar.

public ValueTask AddCalendar(string calendarName, ICalendar calendar, AddCalendarOptions options = default, CancellationToken cancellationToken = default)

Parameters

calendarName string

The name.

calendar ICalendar

The ICalendar to be stored.

options AddCalendarOptions

Whether an existing calendar of the same name may be over-written, and whether the triggers referencing it have their next fire time re-computed.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask

Exceptions

ObjectAlreadyExistsException

A calendar of that name exists and Replace is not set.

JobPersistenceException

The calendar threw while a trigger's next fire time was re-computed. Nothing was changed: the calendar it was to replace and every trigger are as they were, as the database store's transaction leaves them.

AddJob(IJobDetail, AddJobOptions, CancellationToken)

Store the given IJob.

public ValueTask AddJob(IJobDetail job, AddJobOptions options = default, CancellationToken cancellationToken = default)

Parameters

job IJobDetail

The IJob to be stored.

options AddJobOptions

How to store it; see AddJob(IJobDetail, AddJobOptions, CancellationToken).

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask

AddTrigger(IOperableTrigger, AddTriggerOptions, CancellationToken)

Store the given ITrigger.

public ValueTask AddTrigger(IOperableTrigger trigger, AddTriggerOptions options = default, CancellationToken cancellationToken = default)

Parameters

trigger IOperableTrigger

The ITrigger to be stored.

options AddTriggerOptions

How to store it; see AddTrigger(IOperableTrigger, AddTriggerOptions, CancellationToken).

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask

Clear(CancellationToken)

Clears (deletes!) all scheduling data - all IJobs, ITriggers ICalendars.

public ValueTask Clear(CancellationToken cancellationToken = default)

Parameters

cancellationToken CancellationToken

Returns

ValueTask

DeleteCalendar(string, CancellationToken)

Remove (delete) the ICalendar with the given name.

If removal of the ICalendar would result in ITriggers pointing to non-existent calendars, then a JobPersistenceException will be thrown.

public ValueTask<bool> DeleteCalendar(string calendarName, CancellationToken cancellationToken = default)

Parameters

calendarName string

The name of the ICalendar to be removed.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<bool>

true if a ICalendar with the given name was found and removed from the store.

DeleteJob(JobKey, CancellationToken)

Remove (delete) the IJob with the given name, and any ITrigger s that reference it.

public ValueTask<bool> DeleteJob(JobKey jobKey, CancellationToken cancellationToken = default)

Parameters

jobKey JobKey
cancellationToken CancellationToken

Returns

ValueTask<bool>

true if a IJob with the given name and group was found and removed from the store.

DeleteJobs(GroupMatcher<JobKey>, CancellationToken)

Deletes the jobs in the matching groups, resolving the keys under the same lock that removes them so that a job stored meanwhile cannot slip through the gap.

public ValueTask<List<JobKey>> DeleteJobs(GroupMatcher<JobKey> matcher, CancellationToken cancellationToken = default)

Parameters

matcher GroupMatcher<JobKey>
cancellationToken CancellationToken

Returns

ValueTask<List<JobKey>>

DeleteJobs(IReadOnlyCollection<JobKey>, CancellationToken)

Remove (delete) the IJobs with the given keys, and any ITriggers that reference them.

public ValueTask<List<JobKey>> DeleteJobs(IReadOnlyCollection<JobKey> jobKeys, CancellationToken cancellationToken = default)

Parameters

jobKeys IReadOnlyCollection<JobKey>
cancellationToken CancellationToken

Returns

ValueTask<List<JobKey>>

The keys this call removed, in the order they were given. A key that names no job is simply absent — the plural of the single-key bool, not a failure.

Remarks

The default implementation walks the set one key at a time. A store overrides it to do the walk inside a single lock or connection scope; the answer must not change when it does.

See Also

DeleteTrigger(TriggerKey, CancellationToken)

Remove (delete) the ITrigger with the given name.

public ValueTask<bool> DeleteTrigger(TriggerKey triggerKey, CancellationToken cancellationToken = default)

Parameters

triggerKey TriggerKey
cancellationToken CancellationToken

Returns

ValueTask<bool>

true if a ITrigger with the given name and group was found and removed from the store.

DeleteTriggers(GroupMatcher<TriggerKey>, CancellationToken)

Deletes the jobs in the matching groups, resolving the keys under the same lock that removes them so that a job stored meanwhile cannot slip through the gap.

public ValueTask<List<TriggerKey>> DeleteTriggers(GroupMatcher<TriggerKey> matcher, CancellationToken cancellationToken = default)

Parameters

matcher GroupMatcher<TriggerKey>
cancellationToken CancellationToken

Returns

ValueTask<List<TriggerKey>>

DeleteTriggers(IReadOnlyCollection<TriggerKey>, CancellationToken)

Remove (delete) the ITriggers with the given keys.

public ValueTask<List<TriggerKey>> DeleteTriggers(IReadOnlyCollection<TriggerKey> triggerKeys, CancellationToken cancellationToken = default)

Parameters

triggerKeys IReadOnlyCollection<TriggerKey>
cancellationToken CancellationToken

Returns

ValueTask<List<TriggerKey>>

The keys this call removed, in the order they were given. A key that names no trigger is simply absent — the plural of the single-key bool, not a failure. A job left orphaned and non-durable by the removal is deleted too, as in the single-key form, but the answer names triggers only.

Remarks

The default implementation walks the set one key at a time. A store overrides it to do the walk inside a single lock or connection scope; the answer must not change when it does.

See Also

Exists(JobKey, CancellationToken)

Determine whether a IJob with the given identifier already exists within the scheduler.

public ValueTask<bool> Exists(JobKey jobKey, CancellationToken cancellationToken = default)

Parameters

jobKey JobKey

the identifier to check for

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<bool>

true if a Job exists with the given identifier

Exists(TriggerKey, CancellationToken)

Determine whether a ITrigger with the given identifier already exists within the scheduler.

public ValueTask<bool> Exists(TriggerKey triggerKey, CancellationToken cancellationToken = default)

Parameters

triggerKey TriggerKey

triggerKey the identifier to check for

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<bool>

true if a Trigger exists with the given identifier

Exists(string, CancellationToken)

Determine whether an ICalendar with the given name already exists within the store.

public ValueTask<bool> Exists(string calendarName, CancellationToken cancellationToken = default)

Parameters

calendarName string

the name to check for

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<bool>

true if a calendar is stored under the given name

FiringComplete(TriggeredJobCompleteContext, CancellationToken)

The same completion, with everything the run shell learned about the firing: how it ended, and the exception it ended with. This is the member the scheduler calls.

public ValueTask FiringComplete(TriggeredJobCompleteContext context, CancellationToken cancellationToken = default)

Parameters

context TriggeredJobCompleteContext

The firing that completed, and how it ended.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask

Remarks

The outcome is what settles the continuations waiting on the trigger — released when it matches their condition, discarded when it does not — inside the same lock and transaction as the rest of the completion, so a crash cannot leave one half-settled.

A default interface member, so a store written against an earlier 4.x keeps working: the default drops the outcome and calls TriggeredJobComplete(IOperableTrigger, IJobDetail, SchedulerInstruction, CancellationToken), which is exactly what such a store already does. It is a new name rather than an overload of that one because PublicApiGenerator marks default implementations per method name, and an overload would make the API baseline claim the abstract member is a default too.

GetAcquireRetryDelay(int)

Get the amount of time to wait when accessing this job store repeatedly fails.

public TimeSpan GetAcquireRetryDelay(int failureCount)

Parameters

failureCount int

the number of successive failures seen so far

Returns

TimeSpan

the time to wait before trying again

Remarks

Called by the executor thread(s) when calls to AcquireNextTriggers fail more than once in succession, and the thread thus wants to wait a bit before trying again, to not consume 100% CPU, write huge amounts of errors into logs, etc. in cases like the DB being offline/restarting.

The delay returned by implementations should be between 20 milliseconds and 10 minutes.

GetCalendar(string, CancellationToken)

Retrieve the given ITrigger.

public ValueTask<ICalendar?> GetCalendar(string calendarName, CancellationToken cancellationToken = default)

Parameters

calendarName string

The name of the ICalendar to be retrieved.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<ICalendar>

The desired ICalendar, or null if there is no match.

GetJob(JobKey, CancellationToken)

Retrieve the IJobDetail for the given IJob.

public ValueTask<IJobDetail?> GetJob(JobKey jobKey, CancellationToken cancellationToken = default)

Parameters

jobKey JobKey
cancellationToken CancellationToken

Returns

ValueTask<IJobDetail>

The desired IJob, or null if there is no match.

GetJobGroupPause(string, CancellationToken)

The pause recorded for the job group, while it is paused.

public ValueTask<PauseInfo?> GetJobGroupPause(string groupName, CancellationToken cancellationToken = default)

Parameters

groupName string

The job group to ask about.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<PauseInfo>

Remarks

null when the group is not paused, or was paused without a reason. A default interface member, whose default answers null.

GetJobs(IReadOnlyCollection<JobKey>, CancellationToken)

Retrieves the given jobs in one round trip. Keys that do not exist are simply absent from the result.

public ValueTask<List<IJobDetail>> GetJobs(IReadOnlyCollection<JobKey> jobKeys, CancellationToken cancellationToken = default)

Parameters

jobKeys IReadOnlyCollection<JobKey>

The keys of the jobs to retrieve.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<List<IJobDetail>>

GetTrigger(TriggerKey, CancellationToken)

Retrieve the given ITrigger.

public ValueTask<IOperableTrigger?> GetTrigger(TriggerKey triggerKey, CancellationToken cancellationToken = default)

Parameters

triggerKey TriggerKey
cancellationToken CancellationToken

Returns

ValueTask<IOperableTrigger>

The desired ITrigger, or null if there is no match.

GetTriggerGroupPause(string, CancellationToken)

The pause recorded for the trigger group, while it is paused.

public ValueTask<PauseInfo?> GetTriggerGroupPause(string groupName, CancellationToken cancellationToken = default)

Parameters

groupName string

The trigger group to ask about.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<PauseInfo>

Remarks

null when the group is not paused, or was paused without a reason. A default interface member, whose default answers null.

GetTriggerPause(TriggerKey, CancellationToken)

The pause recorded for the trigger, while it is paused.

public ValueTask<PauseInfo?> GetTriggerPause(TriggerKey triggerKey, CancellationToken cancellationToken = default)

Parameters

triggerKey TriggerKey

The trigger to ask about.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<PauseInfo>

Remarks

The pause a *With member recorded on the trigger itself. A trigger that is paused without a record of its own — one stored into a group that was already paused — answers its trigger group's record, and then its job group's.

null when the trigger does not exist, is not paused, or was paused by something that records nothing: a reasonless pause, a scheduler or store written against an earlier 4.x, or a 4.2 node sharing the database. A record is answered only while the trigger is paused, so what such a node's resume left behind is never reported for a trigger that is running. A default interface member, whose default answers null.

GetTriggerState(TriggerKey, CancellationToken)

Get the current state of the identified ITrigger.

public ValueTask<TriggerState> GetTriggerState(TriggerKey triggerKey, CancellationToken cancellationToken = default)

Parameters

triggerKey TriggerKey
cancellationToken CancellationToken

Returns

ValueTask<TriggerState>
See Also

GetTriggers(IReadOnlyCollection<TriggerKey>, CancellationToken)

Retrieves the given triggers in one round trip. Keys that do not exist are simply absent from the result.

public ValueTask<List<IOperableTrigger>> GetTriggers(IReadOnlyCollection<TriggerKey> triggerKeys, CancellationToken cancellationToken = default)

Parameters

triggerKeys IReadOnlyCollection<TriggerKey>

The keys of the triggers to retrieve.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<List<IOperableTrigger>>

GetTriggersForJob(JobKey, CancellationToken)

Get all the Triggers that are associated to the given Job.

If there are no matches, a zero-length array should be returned.

public ValueTask<List<IOperableTrigger>> GetTriggersForJob(JobKey jobKey, CancellationToken cancellationToken = default)

Parameters

jobKey JobKey
cancellationToken CancellationToken

Returns

ValueTask<List<IOperableTrigger>>

Initialize(SchedulerIdentity, CancellationToken)

Called by the QuartzScheduler before the IJobStore is used, in order to give it a chance to Initialize.

public ValueTask Initialize(SchedulerIdentity identity, CancellationToken cancellationToken = default)

Parameters

identity SchedulerIdentity
cancellationToken CancellationToken

Returns

ValueTask

PauseAll(CancellationToken)

Pause all triggers - equivalent of calling PauseTriggerGroups(GroupMatcher<TriggerKey>, CancellationToken) on every group.

When ResumeAll(CancellationToken) is called (to un-pause), trigger misfire instructions WILL be applied.

public ValueTask PauseAll(CancellationToken cancellationToken = default)

Parameters

cancellationToken CancellationToken

Returns

ValueTask
See Also

PauseAllWith(PauseDetails?, CancellationToken)

PauseAll(CancellationToken), recording why and who asked on each group and trigger this call pauses.

public ValueTask PauseAllWith(PauseDetails? details, CancellationToken cancellationToken = default)

Parameters

details PauseDetails

Why, and who asked; null for the reasonless pause.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask

Remarks

Every *With pause member, here and on IJobStore, is its reasonless twin with a record. The store stamps the details with the scheduler's clock, cuts texts longer than MaxReasonLength and MaxRequestedByLength, and keeps them on each trigger and group the call moves into the paused state until it is resumed; GetTriggerPause(TriggerKey, CancellationToken), GetTriggerGroupPause(string, CancellationToken) and GetJobGroupPause(string, CancellationToken) read them back. A trigger or group that was already paused keeps the pause it had.

null, or details that say nothing, is exactly the reasonless twin — the same writes, through the same extension points — and records nothing.

A default interface member, whose default drops the details and calls the reasonless twin, which is what a scheduler or store written against an earlier 4.x does. A new name rather than an overload, because the API baseline marks default implementations per name.

PauseJob(JobKey, CancellationToken)

Pause the IJobDetail with the given name - by pausing all of its current ITriggers.

public ValueTask<bool> PauseJob(JobKey jobKey, CancellationToken cancellationToken = default)

Parameters

jobKey JobKey
cancellationToken CancellationToken

Returns

ValueTask<bool>

PauseJobGroups(GroupMatcher<JobKey>, CancellationToken)

Pause all of the IJobDetails in the given group - by pausing all of their ITriggers.

The JobStore should "remember" that the group is paused, and impose the pause on any new jobs that are added to the group while the group is paused.

public ValueTask<List<string>> PauseJobGroups(GroupMatcher<JobKey> matcher, CancellationToken cancellationToken = default)

Parameters

matcher GroupMatcher<JobKey>
cancellationToken CancellationToken

Returns

ValueTask<List<string>>

PauseJobGroupsWith(GroupMatcher<JobKey>, PauseDetails?, CancellationToken)

PauseJobGroups(GroupMatcher<JobKey>, CancellationToken), recording why and who asked on each group this call pauses and on each trigger it moves.

public ValueTask<List<string>> PauseJobGroupsWith(GroupMatcher<JobKey> matcher, PauseDetails? details, CancellationToken cancellationToken = default)

Parameters

matcher GroupMatcher<JobKey>

The groups to pause.

details PauseDetails

Why, and who asked; null for the reasonless pause.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<List<string>>

What PauseJobGroups(GroupMatcher<JobKey>, CancellationToken) returns.

Remarks

Every *With pause member, here and on IJobStore, is its reasonless twin with a record. The store stamps the details with the scheduler's clock, cuts texts longer than MaxReasonLength and MaxRequestedByLength, and keeps them on each trigger and group the call moves into the paused state until it is resumed; GetTriggerPause(TriggerKey, CancellationToken), GetTriggerGroupPause(string, CancellationToken) and GetJobGroupPause(string, CancellationToken) read them back. A trigger or group that was already paused keeps the pause it had.

null, or details that say nothing, is exactly the reasonless twin — the same writes, through the same extension points — and records nothing.

A default interface member, whose default drops the details and calls the reasonless twin, which is what a scheduler or store written against an earlier 4.x does. A new name rather than an overload, because the API baseline marks default implementations per name.

PauseJobWith(JobKey, PauseDetails?, CancellationToken)

PauseJob(JobKey, CancellationToken), recording why and who asked on each trigger of the job this call pauses.

public ValueTask<bool> PauseJobWith(JobKey jobKey, PauseDetails? details, CancellationToken cancellationToken = default)

Parameters

jobKey JobKey

The job whose triggers to pause.

details PauseDetails

Why, and who asked; null for the reasonless pause.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<bool>

What PauseJob(JobKey, CancellationToken) returns.

Remarks

Every *With pause member, here and on IJobStore, is its reasonless twin with a record. The store stamps the details with the scheduler's clock, cuts texts longer than MaxReasonLength and MaxRequestedByLength, and keeps them on each trigger and group the call moves into the paused state until it is resumed; GetTriggerPause(TriggerKey, CancellationToken), GetTriggerGroupPause(string, CancellationToken) and GetJobGroupPause(string, CancellationToken) read them back. A trigger or group that was already paused keeps the pause it had.

null, or details that say nothing, is exactly the reasonless twin — the same writes, through the same extension points — and records nothing.

A default interface member, whose default drops the details and calls the reasonless twin, which is what a scheduler or store written against an earlier 4.x does. A new name rather than an overload, because the API baseline marks default implementations per name.

PauseJobs(IReadOnlyCollection<JobKey>, CancellationToken)

Pauses the whole set inside one lock pass rather than taking the lock per key.

public ValueTask<List<JobKey>> PauseJobs(IReadOnlyCollection<JobKey> jobKeys, CancellationToken cancellationToken = default)

Parameters

jobKeys IReadOnlyCollection<JobKey>
cancellationToken CancellationToken

Returns

ValueTask<List<JobKey>>

PauseJobsWith(IReadOnlyCollection<JobKey>, PauseDetails?, CancellationToken)

PauseJobs(IReadOnlyCollection<JobKey>, CancellationToken), recording why and who asked on each trigger of the jobs this call pauses.

public ValueTask<List<JobKey>> PauseJobsWith(IReadOnlyCollection<JobKey> jobKeys, PauseDetails? details, CancellationToken cancellationToken = default)

Parameters

jobKeys IReadOnlyCollection<JobKey>

The jobs whose triggers to pause.

details PauseDetails

Why, and who asked; null for the reasonless pause.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<List<JobKey>>

What PauseJobs(IReadOnlyCollection<JobKey>, CancellationToken) returns.

Remarks

A store overrides it to pause the set inside one lock and one transaction; the answer must not change when it does. null, or details that say nothing, is exactly PauseJobs(IReadOnlyCollection<JobKey>, CancellationToken).

A default interface member, added in 4.4. Unlike the other *With defaults, it keeps the details: details that say something go to PauseJobWith(JobKey, PauseDetails?, CancellationToken) one key at a time, so a store written against 4.3 still records them.

PauseTrigger(TriggerKey, CancellationToken)

Pause the ITrigger with the given name.

public ValueTask<bool> PauseTrigger(TriggerKey triggerKey, CancellationToken cancellationToken = default)

Parameters

triggerKey TriggerKey
cancellationToken CancellationToken

Returns

ValueTask<bool>

PauseTriggerGroups(GroupMatcher<TriggerKey>, CancellationToken)

Pause all of the ITriggers in the given group.

The JobStore should "remember" that the group is paused, and impose the pause on any new triggers that are added to the group while the group is paused.

public ValueTask<List<string>> PauseTriggerGroups(GroupMatcher<TriggerKey> matcher, CancellationToken cancellationToken = default)

Parameters

matcher GroupMatcher<TriggerKey>
cancellationToken CancellationToken

Returns

ValueTask<List<string>>

PauseTriggerGroupsWith(GroupMatcher<TriggerKey>, PauseDetails?, CancellationToken)

PauseTriggerGroups(GroupMatcher<TriggerKey>, CancellationToken), recording why and who asked on each group this call pauses and on each trigger it moves.

public ValueTask<List<string>> PauseTriggerGroupsWith(GroupMatcher<TriggerKey> matcher, PauseDetails? details, CancellationToken cancellationToken = default)

Parameters

matcher GroupMatcher<TriggerKey>

The groups to pause.

details PauseDetails

Why, and who asked; null for the reasonless pause.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<List<string>>

What PauseTriggerGroups(GroupMatcher<TriggerKey>, CancellationToken) returns.

Remarks

Every *With pause member, here and on IJobStore, is its reasonless twin with a record. The store stamps the details with the scheduler's clock, cuts texts longer than MaxReasonLength and MaxRequestedByLength, and keeps them on each trigger and group the call moves into the paused state until it is resumed; GetTriggerPause(TriggerKey, CancellationToken), GetTriggerGroupPause(string, CancellationToken) and GetJobGroupPause(string, CancellationToken) read them back. A trigger or group that was already paused keeps the pause it had.

null, or details that say nothing, is exactly the reasonless twin — the same writes, through the same extension points — and records nothing.

A default interface member, whose default drops the details and calls the reasonless twin, which is what a scheduler or store written against an earlier 4.x does. A new name rather than an overload, because the API baseline marks default implementations per name.

PauseTriggerWith(TriggerKey, PauseDetails?, CancellationToken)

PauseTrigger(TriggerKey, CancellationToken), recording why and who asked on the trigger if this call pauses it.

public ValueTask<bool> PauseTriggerWith(TriggerKey triggerKey, PauseDetails? details, CancellationToken cancellationToken = default)

Parameters

triggerKey TriggerKey

The trigger to pause.

details PauseDetails

Why, and who asked; null for the reasonless pause.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<bool>

What PauseTrigger(TriggerKey, CancellationToken) returns.

Remarks

Every *With pause member, here and on IJobStore, is its reasonless twin with a record. The store stamps the details with the scheduler's clock, cuts texts longer than MaxReasonLength and MaxRequestedByLength, and keeps them on each trigger and group the call moves into the paused state until it is resumed; GetTriggerPause(TriggerKey, CancellationToken), GetTriggerGroupPause(string, CancellationToken) and GetJobGroupPause(string, CancellationToken) read them back. A trigger or group that was already paused keeps the pause it had.

null, or details that say nothing, is exactly the reasonless twin — the same writes, through the same extension points — and records nothing.

A default interface member, whose default drops the details and calls the reasonless twin, which is what a scheduler or store written against an earlier 4.x does. A new name rather than an overload, because the API baseline marks default implementations per name.

PauseTriggers(IReadOnlyCollection<TriggerKey>, CancellationToken)

Pauses the whole set inside one lock pass rather than taking the lock per key.

public ValueTask<List<TriggerKey>> PauseTriggers(IReadOnlyCollection<TriggerKey> triggerKeys, CancellationToken cancellationToken = default)

Parameters

triggerKeys IReadOnlyCollection<TriggerKey>
cancellationToken CancellationToken

Returns

ValueTask<List<TriggerKey>>

PauseTriggersWith(IReadOnlyCollection<TriggerKey>, PauseDetails?, CancellationToken)

PauseTriggers(IReadOnlyCollection<TriggerKey>, CancellationToken), recording why and who asked on each trigger this call pauses.

public ValueTask<List<TriggerKey>> PauseTriggersWith(IReadOnlyCollection<TriggerKey> triggerKeys, PauseDetails? details, CancellationToken cancellationToken = default)

Parameters

triggerKeys IReadOnlyCollection<TriggerKey>

The triggers to pause.

details PauseDetails

Why, and who asked; null for the reasonless pause.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<List<TriggerKey>>

What PauseTriggers(IReadOnlyCollection<TriggerKey>, CancellationToken) returns.

Remarks

A store overrides it to pause the set inside one lock and one transaction, stamping every trigger with the same instant; the answer must not change when it does. A trigger that was already paused keeps the pause it had. null, or details that say nothing, is exactly PauseTriggers(IReadOnlyCollection<TriggerKey>, CancellationToken).

A default interface member, added in 4.4. Unlike the other *With defaults, it keeps the details: details that say something go to PauseTriggerWith(TriggerKey, PauseDetails?, CancellationToken) one key at a time, so a store written against 4.3, which records them there, still records them.

QueryCalendarNames(CalendarQuery, CancellationToken)

Lists calendar names matching the query, ordered by name (ordinal).

public ValueTask<PagedResult<string>> QueryCalendarNames(CalendarQuery query, CancellationToken cancellationToken = default)

Parameters

query CalendarQuery

Which names to select and which page of them to return.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<PagedResult<string>>

QueryClusterNodes(CancellationToken)

Lists the scheduler nodes this store knows about, as ClusterNodes: the current node first, then the rest by instance id (ordinal).

public ValueTask<List<ClusterNode>> QueryClusterNodes(CancellationToken cancellationToken = default)

Parameters

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<List<ClusterNode>>

Remarks

The current node is always in the list, whether or not the store has a record of it yet, and it is the only one whose IsCurrentNode is true. A store that keeps no check-in history — the in-memory one, and a persistent one that is not clustered — answers with that single node, Alive and with no times, because a lone node has nobody to be late for.

A clustered store reports every node it has a check-in record for, including nodes that are dead but not yet swept, and decides State with the same predicate its recovery pass uses — so a node this listing calls Failed is a node whose work the cluster is about to take over, rather than one that merely looks late to a second opinion.

Unpaged, because a cluster is a handful of nodes rather than a data set; the listing that does need paging is QueryFireInstances(FireInstanceQuery, CancellationToken), which reports what each node is running.

QueryFireInstances(FireInstanceQuery, CancellationToken)

Lists firings matching the query, as FireInstances, ordered by trigger group, then trigger name, then fire instance id (all ordinal).

public ValueTask<PagedResult<FireInstance>> QueryFireInstances(FireInstanceQuery query, CancellationToken cancellationToken = default)

Parameters

query FireInstanceQuery

What to select and which page of it to return.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<PagedResult<FireInstance>>

Remarks

The tiebreaker is what makes a page deterministic here: one trigger can have several firings in flight, so a store must not collapse them and must not order two of them arbitrarily.

A store that keeps firings durably answers for the whole cluster; the in-memory store answers for its own process, which is the whole of its world. Either way the reported SchedulerInstanceId is the id the owning node was initialized with.

QueryJobGroups(JobGroupQuery, CancellationToken)

Lists job groups matching the query, ordered by name (ordinal).

public ValueTask<PagedResult<JobGroup>> QueryJobGroups(JobGroupQuery query, CancellationToken cancellationToken = default)

Parameters

query JobGroupQuery

What to select and which page of it to return.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<PagedResult<JobGroup>>

QueryJobs(JobQuery, CancellationToken)

Lists jobs matching the query, as JobHeaders, ordered by group and then name (ordinal).

public ValueTask<PagedResult<JobHeader>> QueryJobs(JobQuery query, CancellationToken cancellationToken = default)

Parameters

query JobQuery

What to select and which page of it to return.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<PagedResult<JobHeader>>

Remarks

A listing must not load or deserialize job data. When the query sets IncludeTotalCount, the result carries the total number of matching jobs regardless of paging.

QueryTriggerGroups(TriggerGroupQuery, CancellationToken)

Lists trigger groups matching the query, ordered by name (ordinal).

public ValueTask<PagedResult<TriggerGroup>> QueryTriggerGroups(TriggerGroupQuery query, CancellationToken cancellationToken = default)

Parameters

query TriggerGroupQuery

What to select and which page of it to return.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<PagedResult<TriggerGroup>>

Remarks

With Paused set to true, the listing reports every paused group, including a group that is paused but currently has no triggers.

QueryTriggers(TriggerQuery, CancellationToken)

Lists triggers matching the query, as TriggerHeaders, ordered by group and then name (ordinal).

public ValueTask<PagedResult<TriggerHeader>> QueryTriggers(TriggerQuery query, CancellationToken cancellationToken = default)

Parameters

query TriggerQuery

What to select and which page of it to return.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<PagedResult<TriggerHeader>>

Remarks

A listing must not materialize triggers or their job data. The header carries the trigger's current state and execution group, so listing callers need no further round trips.

ReleaseAcquiredTrigger(IOperableTrigger, CancellationToken)

Inform the IJobStore that the scheduler no longer plans to fire the given ITrigger, that it had previously acquired (reserved).

public ValueTask ReleaseAcquiredTrigger(IOperableTrigger trigger, CancellationToken cancellationToken = default)

Parameters

trigger IOperableTrigger
cancellationToken CancellationToken

Returns

ValueTask

ReplaceTrigger(TriggerKey, IOperableTrigger, CancellationToken)

Replaces one trigger with another for the same job, keeping the job and every other trigger of it as they are.

public ValueTask<bool> ReplaceTrigger(TriggerKey triggerKey, IOperableTrigger trigger, CancellationToken cancellationToken = default)

Parameters

triggerKey TriggerKey

The TriggerKey of the ITrigger to be replaced.

trigger IOperableTrigger

The new trigger.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<bool>

Remarks

The replacement must name the same job: a trigger that pointed somewhere else would move work from one job to another under a call that says it is replacing a schedule. The replacement's state is decided afresh, as in the ADO store: paused if its trigger group or job group is paused, blocked if its job disallows concurrent execution and is running, and waiting otherwise. So a replace resumes a trigger that was paused on its own, which is the store contract and Java's. One that stays paused because a group is keeps the record of its pause. A declared trigger re-applied at a start is the exception: it keeps an individual pause (#4128).

ResetTriggerFromErrorState(TriggerKey, CancellationToken)

Reset the current state of the identified ITrigger from Error to Normal or Paused as appropriate.

public ValueTask<bool> ResetTriggerFromErrorState(TriggerKey triggerKey, CancellationToken cancellationToken = default)

Parameters

triggerKey TriggerKey
cancellationToken CancellationToken

Returns

ValueTask<bool>

true if the trigger existed in the error state and was reset by this call, false if there is no trigger with the given key or it was not in the error state.

Remarks

Only affects triggers that are in Error state - if identified trigger is not in that state then the result is a no-op.

The result will be the trigger returning to the normal, waiting to be fired state, unless the trigger's group has been paused, in which case it will go into the Paused state.

See Also

ResetTriggersFromErrorState(IReadOnlyCollection<TriggerKey>, CancellationToken)

Resets the whole set inside one lock pass rather than taking the lock per key.

public ValueTask<List<TriggerKey>> ResetTriggersFromErrorState(IReadOnlyCollection<TriggerKey> triggerKeys, CancellationToken cancellationToken = default)

Parameters

triggerKeys IReadOnlyCollection<TriggerKey>
cancellationToken CancellationToken

Returns

ValueTask<List<TriggerKey>>

ResumeAll(CancellationToken)

Resume (un-pause) all triggers - equivalent of calling ResumeTriggerGroups(GroupMatcher<TriggerKey>, CancellationToken) on every trigger group and setting all job groups unpaused />.

If any ITrigger missed one or more fire-times, then the ITrigger's misfire instruction will be applied.

public ValueTask ResumeAll(CancellationToken cancellationToken = default)

Parameters

cancellationToken CancellationToken

Returns

ValueTask
See Also

ResumeJob(JobKey, CancellationToken)

Resume (un-pause) the IJobDetail with the given name.

If any of the IJob'sITrigger s missed one or more fire-times, then the ITrigger's misfire instruction will be applied.

public ValueTask<bool> ResumeJob(JobKey jobKey, CancellationToken cancellationToken = default)

Parameters

jobKey JobKey
cancellationToken CancellationToken

Returns

ValueTask<bool>

ResumeJobGroups(GroupMatcher<JobKey>, CancellationToken)

Resume (un-pause) all of the IJobDetails in the given group.

If any of the IJob s had ITrigger s that missed one or more fire-times, then the ITrigger's misfire instruction will be applied.

public ValueTask<List<string>> ResumeJobGroups(GroupMatcher<JobKey> matcher, CancellationToken cancellationToken = default)

Parameters

matcher GroupMatcher<JobKey>
cancellationToken CancellationToken

Returns

ValueTask<List<string>>

ResumeJobs(IReadOnlyCollection<JobKey>, CancellationToken)

Resumes the whole set inside one lock pass rather than taking the lock per key.

public ValueTask<List<JobKey>> ResumeJobs(IReadOnlyCollection<JobKey> jobKeys, CancellationToken cancellationToken = default)

Parameters

jobKeys IReadOnlyCollection<JobKey>
cancellationToken CancellationToken

Returns

ValueTask<List<JobKey>>

ResumeTrigger(TriggerKey, CancellationToken)

Resume (un-pause) the ITrigger with the given key.

public ValueTask<bool> ResumeTrigger(TriggerKey triggerKey, CancellationToken cancellationToken = default)

Parameters

triggerKey TriggerKey
cancellationToken CancellationToken

Returns

ValueTask<bool>

Remarks

If the ITrigger missed one or more fire-times, then the ITrigger's misfire instruction will be applied.

ResumeTriggerGroups(GroupMatcher<TriggerKey>, CancellationToken)

Resume (un-pause) all of the ITriggers in the given group.

If any ITrigger missed one or more fire-times, then the ITrigger's misfire instruction will be applied.

public ValueTask<List<string>> ResumeTriggerGroups(GroupMatcher<TriggerKey> matcher, CancellationToken cancellationToken = default)

Parameters

matcher GroupMatcher<TriggerKey>
cancellationToken CancellationToken

Returns

ValueTask<List<string>>

ResumeTriggers(IReadOnlyCollection<TriggerKey>, CancellationToken)

Resumes the whole set inside one lock pass rather than taking the lock per key.

public ValueTask<List<TriggerKey>> ResumeTriggers(IReadOnlyCollection<TriggerKey> triggerKeys, CancellationToken cancellationToken = default)

Parameters

triggerKeys IReadOnlyCollection<TriggerKey>
cancellationToken CancellationToken

Returns

ValueTask<List<TriggerKey>>

ScheduleJob(IJobDetail, IOperableTrigger, CancellationToken)

Store the given IJobDetail and ITrigger.

public ValueTask ScheduleJob(IJobDetail job, IOperableTrigger trigger, CancellationToken cancellationToken = default)

Parameters

job IJobDetail

The IJobDetail to be stored.

trigger IOperableTrigger

The ITrigger to be stored.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask

ScheduleJobs(IReadOnlyDictionary<IJobDetail, IReadOnlyCollection<IOperableTrigger>>, ScheduleJobOptions, CancellationToken)

Store all the given jobs with their related triggers.

public ValueTask ScheduleJobs(IReadOnlyDictionary<IJobDetail, IReadOnlyCollection<IOperableTrigger>> triggersAndJobs, ScheduleJobOptions options = default, CancellationToken cancellationToken = default)

Parameters

triggersAndJobs IReadOnlyDictionary<IJobDetail, IReadOnlyCollection<IOperableTrigger>>

The jobs to store, each with the triggers that fire it. IOperableTrigger, like the rest of the store contract — the scheduler validates and downcasts the caller's triggers before they reach the store.

options ScheduleJobOptions

How to store them. Replace over-writes any job or trigger already stored under one of the same keys; without it, a key that exists throws ObjectAlreadyExistsException and none of the batch is stored. Paused stores every trigger paused; it reaches only a store that says SupportsStoringPaused.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask

Exceptions

ObjectAlreadyExistsException

A key in the batch is already stored and Replace was not asked for. None of the batch is stored.

SchedulerPaused(CancellationToken)

Called by the QuartzScheduler to inform the JobStore that the scheduler has been paused.

public ValueTask SchedulerPaused(CancellationToken cancellationToken = default)

Parameters

cancellationToken CancellationToken

Returns

ValueTask

SchedulerResumed(CancellationToken)

Called by the QuartzScheduler to inform the JobStore that the scheduler has resumed after being paused.

public ValueTask SchedulerResumed(CancellationToken cancellationToken = default)

Parameters

cancellationToken CancellationToken

Returns

ValueTask

SchedulerStarted(CancellationToken)

Called by the QuartzScheduler to inform the IJobStore that the scheduler has started.

public ValueTask SchedulerStarted(CancellationToken cancellationToken = default)

Parameters

cancellationToken CancellationToken

Returns

ValueTask

Shutdown(CancellationToken)

Called by the QuartzScheduler to inform the IJobStore that it should free up all of its resources because the scheduler is shutting down.

public ValueTask Shutdown(CancellationToken cancellationToken = default)

Parameters

cancellationToken CancellationToken

Returns

ValueTask

StoreTrigger(IOperableTrigger, TriggerConflict, CancellationToken)

Store the given trigger, deciding what becomes of one already stored under its key, and say which it was.

public ValueTask<ScheduleTriggerResult> StoreTrigger(IOperableTrigger trigger, TriggerConflict onConflict, CancellationToken cancellationToken = default)

Parameters

trigger IOperableTrigger

The trigger to store, its first fire time already computed.

onConflict TriggerConflict

What to do when a trigger is stored under the same key.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<ScheduleTriggerResult>

Whether the trigger was created, stored over another or not stored, and when the stored trigger fires next.

Remarks

The decision and the write are one operation under the store's lock, so of two callers storing the same key with Keep exactly one creates the trigger and the other is told it was kept. Keep and KeepEarlier keep only a trigger with a fire time still ahead of it.

A default interface member, so a store written against an earlier 4.x keeps working. The default reads the existing trigger with GetTrigger(TriggerKey, CancellationToken) and writes with AddTrigger(IOperableTrigger, AddTriggerOptions, CancellationToken): correct, and not atomic. A new name rather than an overload of AddTrigger(IOperableTrigger, AddTriggerOptions, CancellationToken), because PublicApiGenerator marks default implementations per method name.

Exceptions

ObjectAlreadyExistsException

A trigger is already stored under the same key and onConflict is Throw.

TriggeredJobComplete(IOperableTrigger, IJobDetail, SchedulerInstruction, CancellationToken)

Inform the IJobStore that the scheduler has completed the firing of the given ITrigger (and the execution its associated IJob), and that the JobDataMap in the given IJobDetail should be updated if the IJob is stateful.

public ValueTask TriggeredJobComplete(IOperableTrigger trigger, IJobDetail jobDetail, SchedulerInstruction triggerInstructionCode, CancellationToken cancellationToken = default)

Parameters

trigger IOperableTrigger
jobDetail IJobDetail
triggerInstructionCode SchedulerInstruction
cancellationToken CancellationToken

Returns

ValueTask

TriggersFired(IReadOnlyCollection<IOperableTrigger>, CancellationToken)

Inform the IJobStore that the scheduler is now firing the given ITrigger (executing its associated IJob), that it had previously acquired (reserved).

public ValueTask<List<TriggerFiredResult>> TriggersFired(IReadOnlyCollection<IOperableTrigger> triggers, CancellationToken cancellationToken = default)

Parameters

triggers IReadOnlyCollection<IOperableTrigger>
cancellationToken CancellationToken

Returns

ValueTask<List<TriggerFiredResult>>

UpdateFireInstanceProgress(string, FireInstanceProgress, CancellationToken)

Records what a running firing last reported about how far it has got, so that QueryFireInstances(FireInstanceQuery, CancellationToken) answers it on Progress and ProgressMessage.

public ValueTask UpdateFireInstanceProgress(string fireInstanceId, FireInstanceProgress progress, CancellationToken cancellationToken = default)

Parameters

fireInstanceId string

The firing, as FireInstanceId names it.

progress FireInstanceProgress

What the firing reported.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask

Remarks

The scheduler calls this at most once a second per firing, only when the value has changed, off the job's own flow and never awaited by it: a failure is logged and the job carries on. The firing is this node's own, so a store needs no scheduler-wide lock to write it. A fire instance that has already completed is not an error — the write simply finds nothing to update.

A default interface member, so a store written against an earlier 4.x keeps working. The default records nothing, and that store's firings report no progress.

UpdateTriggerDetails(TriggerKey, TriggerDetailsUpdate, CancellationToken)

Updates trigger metadata and selected settings without deleting/recreating the trigger and without resetting fire times or trigger state.

public ValueTask<bool> UpdateTriggerDetails(TriggerKey triggerKey, TriggerDetailsUpdate update, CancellationToken cancellationToken = default)

Parameters

triggerKey TriggerKey

The key identifying the trigger to update.

update TriggerDetailsUpdate

The details to update. Only properties explicitly set will be changed. May include the calendar name and the misfire instruction, which can affect firing behavior.

cancellationToken CancellationToken

The cancellation instruction.

Returns

ValueTask<bool>

true if the trigger was found and updated, false if not found.