Class DelegatingJobStore
An IJobStore that forwards every operation to another one, so a store of your own can override the few it cares about and inherit the rest.
public class DelegatingJobStore : IJobStore
- Inheritance
-
DelegatingJobStore
- Implements
- Inherited Members
Remarks
The stores Quartz ships are sealed - RAMJobStore holds a lock while it mutates several indexes in a fixed order and raises notifications after releasing it, none of which an override can be asked to preserve. Decorating one is composition instead: wrap it, and change what you meant to change.
This is the store-level counterpart of DelegatingScheduler. It suits logging, metrics, tenant routing, fault injection and the like. A store that keeps scheduling data somewhere new should implement IJobStore directly rather than derive from this.
Constructors
DelegatingJobStore(IJobStore)
Wraps the job store this one forwards to.
public DelegatingJobStore(IJobStore jobStore)
Parameters
jobStoreIJobStoreThe store every member is forwarded to.
Properties
Clustered
Whether the IJobStore implementation is clustered.
public virtual bool Clustered { get; }
Property Value
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 virtual TimeSpan EstimatedTimeToReleaseAndAcquireTrigger { get; }
Property Value
InnerJobStore
The store this one forwards to, so that code which needs the real store - rather than the behaviour a decorator adds - can reach it through however many layers are in the way.
protected IJobStore InnerJobStore { get; }
Property Value
SupportsPersistence
Indicates whether job store supports persistence.
public virtual bool SupportsPersistence { get; }
Property Value
SupportsStoringPaused
Whether the store honours Paused and Paused, storing a trigger paused in the operation that stores it.
public virtual bool SupportsStoringPaused { get; }
Property Value
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)
Acquires the next triggers to be fired, respecting execution group limits.
public virtual ValueTask<List<IOperableTrigger>> AcquireNextTriggers(TriggerAcquisitionRequest request, CancellationToken cancellationToken = default)
Parameters
requestTriggerAcquisitionRequestWhat to acquire: the cut-off time, how many, the batching window and the per-execution-group capacity still available.
cancellationTokenCancellationTokenThe 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).
AcquireNextTriggersAndFireDue(TriggerAcquisitionRequest, CancellationToken)
Acquires the next triggers through this store's own AcquireNextTriggers(TriggerAcquisitionRequest, CancellationToken), and fires none of them: every one comes back pending, for the scheduler to fire with TriggersFired(IReadOnlyCollection<IOperableTrigger>, CancellationToken).
public virtual ValueTask<TriggerAcquisitionResult> AcquireNextTriggersAndFireDue(TriggerAcquisitionRequest request, CancellationToken cancellationToken = default)
Parameters
requestTriggerAcquisitionRequestWhat to acquire.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
Remarks
Deliberately not handed to the inner store. A decorator that overrides AcquireNextTriggers(TriggerAcquisitionRequest, CancellationToken) — to narrow a request, count acquisitions or inject a fault — or TriggersFired(IReadOnlyCollection<IOperableTrigger>, CancellationToken) goes on seeing every acquisition and every fire, as it did before the scheduler called this member. Forwarded, the inner store would acquire and fire behind the decorator's back.
A decorator that overrides neither, and wants the inner store to fire what is due as it acquires it, overrides this and forwards it to InnerJobStore.
AddCalendar(string, ICalendar, AddCalendarOptions, CancellationToken)
Store the given ICalendar.
public virtual ValueTask AddCalendar(string calendarName, ICalendar calendar, AddCalendarOptions options = default, CancellationToken cancellationToken = default)
Parameters
calendarNamestringThe name.
calendarICalendarThe ICalendar to be stored.
optionsAddCalendarOptionsWhether an existing calendar of the same name may be over-written, and whether the triggers referencing it have their next fire time re-computed. Defaults to neither.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
Exceptions
- ObjectAlreadyExistsException
A calendar is already stored under the same name and Replace was not asked for.
AddJob(IJobDetail, AddJobOptions, CancellationToken)
Store the given IJobDetail.
public virtual ValueTask AddJob(IJobDetail job, AddJobOptions options = default, CancellationToken cancellationToken = default)
Parameters
jobIJobDetailThe IJobDetail to be stored.
optionsAddJobOptionsHow to store it. Replace over-writes a job already stored under the same key; without it, storing one whose key exists throws ObjectAlreadyExistsException. StoreNonDurableWhileAwaitingScheduling is a scheduler-level rule that IScheduler has already applied by the time the store is called, so a store neither reads it nor has anything to do about it.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
AddTrigger(IOperableTrigger, AddTriggerOptions, CancellationToken)
Store the given ITrigger.
public virtual ValueTask AddTrigger(IOperableTrigger trigger, AddTriggerOptions options = default, CancellationToken cancellationToken = default)
Parameters
triggerIOperableTriggerThe ITrigger to be stored.
optionsAddTriggerOptionsHow to store it. Replace over-writes a trigger already stored under the same key; without it, storing one whose key exists throws ObjectAlreadyExistsException. Paused stores it paused; it reaches only a store that says SupportsStoringPaused.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
Exceptions
- ObjectAlreadyExistsException
A trigger is already stored under the same key and Replace was not asked for.
Clear(CancellationToken)
public virtual ValueTask Clear(CancellationToken cancellationToken = default)
Parameters
cancellationTokenCancellationToken
Returns
DeleteCalendar(string, CancellationToken)
Remove (delete) the ICalendar with the given name.
public virtual ValueTask<bool> DeleteCalendar(string calendarName, CancellationToken cancellationToken = default)
Parameters
calendarNamestringThe name of the ICalendar to be removed.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
Remarks
If removal of the ICalendar would result in ITriggers pointing to non-existent calendars, then a JobPersistenceException will be thrown.
DeleteJob(JobKey, CancellationToken)
public virtual ValueTask<bool> DeleteJob(JobKey jobKey, CancellationToken cancellationToken = default)
Parameters
jobKeyJobKeycancellationTokenCancellationToken
Returns
Remarks
If removal of the IJob results in an empty group, the group should be removed from the IJobStore's list of known group names.
DeleteJobs(GroupMatcher<JobKey>, CancellationToken)
public virtual ValueTask<List<JobKey>> DeleteJobs(GroupMatcher<JobKey> matcher, CancellationToken cancellationToken = default)
Parameters
matcherGroupMatcher<JobKey>cancellationTokenCancellationToken
Returns
- ValueTask<List<JobKey>>
The keys this call removed. A group that matched nothing contributes nothing — an empty list is the plural of the single-key false, not a failure.
Remarks
The default implementation lists the matching keys and then deletes them, which is two operations and so lets a job added in between escape. A store overrides it to resolve the keys and delete them under the same lock or connection scope; the answer must not change when it does.
- See Also
DeleteJobs(IReadOnlyCollection<JobKey>, CancellationToken)
public virtual ValueTask<List<JobKey>> DeleteJobs(IReadOnlyCollection<JobKey> jobKeys, CancellationToken cancellationToken = default)
Parameters
jobKeysIReadOnlyCollection<JobKey>cancellationTokenCancellationToken
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 key.
public virtual ValueTask<bool> DeleteTrigger(TriggerKey triggerKey, CancellationToken cancellationToken = default)
Parameters
triggerKeyTriggerKeycancellationTokenCancellationToken
Returns
- ValueTask<bool>
true if a ITrigger with the given name and group was found and removed from the store.
Remarks
If removal of the ITrigger results in an empty group, the group should be removed from the IJobStore's list of known group names.
If removal of the ITrigger results in an 'orphaned' IJob that is not 'durable', then the IJob should be deleted also.
DeleteTriggers(GroupMatcher<TriggerKey>, CancellationToken)
Remove (delete) every ITrigger in the matching groups.
public virtual ValueTask<List<TriggerKey>> DeleteTriggers(GroupMatcher<TriggerKey> matcher, CancellationToken cancellationToken = default)
Parameters
matcherGroupMatcher<TriggerKey>cancellationTokenCancellationToken
Returns
- ValueTask<List<TriggerKey>>
The keys this call removed. 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 lists the matching keys and then deletes them, which is two operations and so lets a trigger added in between escape. A store overrides it to resolve the keys and delete them under the same lock or connection scope; the answer must not change when it does.
- See Also
DeleteTriggers(IReadOnlyCollection<TriggerKey>, CancellationToken)
Remove (delete) the ITriggers with the given keys.
public virtual ValueTask<List<TriggerKey>> DeleteTriggers(IReadOnlyCollection<TriggerKey> triggerKeys, CancellationToken cancellationToken = default)
Parameters
triggerKeysIReadOnlyCollection<TriggerKey>cancellationTokenCancellationToken
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 virtual ValueTask<bool> Exists(JobKey jobKey, CancellationToken cancellationToken = default)
Parameters
jobKeyJobKeythe identifier to check for
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
Exists(TriggerKey, CancellationToken)
Determine whether a ITrigger with the given identifier already exists within the scheduler.
public virtual ValueTask<bool> Exists(TriggerKey triggerKey, CancellationToken cancellationToken = default)
Parameters
triggerKeyTriggerKeythe identifier to check for
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
Exists(string, CancellationToken)
Determine whether an ICalendar with the given name already exists within the store.
public virtual ValueTask<bool> Exists(string calendarName, CancellationToken cancellationToken = default)
Parameters
calendarNamestringthe name to check for
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
Remarks
Answer this without materializing the calendar. GetCalendar(string, CancellationToken) can answer it too, but
only by reading the stored blob and deserializing it to throw it away — which is what a store
implementing this member as GetCalendar(name) is not null would go on doing.
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 virtual ValueTask FiringComplete(TriggeredJobCompleteContext context, CancellationToken cancellationToken = default)
Parameters
contextTriggeredJobCompleteContextThe firing that completed, and how it ended.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
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 virtual TimeSpan GetAcquireRetryDelay(int failureCount)
Parameters
failureCountintthe 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 ICalendar.
public virtual ValueTask<ICalendar?> GetCalendar(string calendarName, CancellationToken cancellationToken = default)
Parameters
calendarNamestringThe name of the ICalendar to be retrieved.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
GetInterruptRequests(CancellationToken)
The fire instance ids of this node's executing firings that carry an interrupt request RequestInterrupt(string, CancellationToken) recorded.
public virtual ValueTask<List<string>> GetInterruptRequests(CancellationToken cancellationToken = default)
Parameters
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
Remarks
The scheduler asks this when the store says it is time to, and interrupts each of the firings named that it is running and has not interrupted yet. A request stays recorded until its firing completes, so the same id may be answered more than once.
A default interface member, added in 4.6. The default answers an empty list.
GetJob(JobKey, CancellationToken)
Retrieve the IJobDetail for the given IJob.
public virtual ValueTask<IJobDetail?> GetJob(JobKey jobKey, CancellationToken cancellationToken = default)
Parameters
jobKeyJobKeycancellationTokenCancellationToken
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 virtual ValueTask<PauseInfo?> GetJobGroupPause(string groupName, CancellationToken cancellationToken = default)
Parameters
groupNamestringThe job group to ask about.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
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 virtual ValueTask<List<IJobDetail>> GetJobs(IReadOnlyCollection<JobKey> jobKeys, CancellationToken cancellationToken = default)
Parameters
jobKeysIReadOnlyCollection<JobKey>The keys of the jobs to retrieve.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
GetTrigger(TriggerKey, CancellationToken)
Retrieve the given ITrigger.
public virtual ValueTask<IOperableTrigger?> GetTrigger(TriggerKey triggerKey, CancellationToken cancellationToken = default)
Parameters
triggerKeyTriggerKeycancellationTokenCancellationToken
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 virtual ValueTask<PauseInfo?> GetTriggerGroupPause(string groupName, CancellationToken cancellationToken = default)
Parameters
groupNamestringThe trigger group to ask about.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
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 virtual ValueTask<PauseInfo?> GetTriggerPause(TriggerKey triggerKey, CancellationToken cancellationToken = default)
Parameters
triggerKeyTriggerKeyThe trigger to ask about.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
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 virtual ValueTask<TriggerState> GetTriggerState(TriggerKey triggerKey, CancellationToken cancellationToken = default)
Parameters
triggerKeyTriggerKeycancellationTokenCancellationToken
Returns
- 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 virtual ValueTask<List<IOperableTrigger>> GetTriggers(IReadOnlyCollection<TriggerKey> triggerKeys, CancellationToken cancellationToken = default)
Parameters
triggerKeysIReadOnlyCollection<TriggerKey>The keys of the triggers to retrieve.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
GetTriggersForJob(JobKey, CancellationToken)
Get all the Triggers that are associated to the given Job.
public virtual ValueTask<List<IOperableTrigger>> GetTriggersForJob(JobKey jobKey, CancellationToken cancellationToken = default)
Parameters
jobKeyJobKeycancellationTokenCancellationToken
Returns
Remarks
If there are no matches, a zero-length array should be returned.
Initialize(SchedulerIdentity, CancellationToken)
Called before the IJobStore is used, to give it a chance to initialize.
public virtual ValueTask Initialize(SchedulerIdentity identity, CancellationToken cancellationToken = default)
Parameters
identitySchedulerIdentityThe scheduler this store stores for, and the node it is running on. A store records the instance id against the firings this node owns, so that QueryFireInstances(FireInstanceQuery, CancellationToken) can say which node is running what.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
Remarks
Nearly everything a job store needs — the type loader, the signaler, the time provider — is supplied through its constructor. What remains here is the scheduler's identity, which is not settled until the container has built the graph, and work that has to happen before the scheduler runs and cannot be done during construction, such as verifying a database schema.
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 virtual ValueTask PauseAll(CancellationToken cancellationToken = default)
Parameters
cancellationTokenCancellationToken
Returns
- See Also
PauseAllWith(PauseDetails?, CancellationToken)
PauseAll(CancellationToken), recording why and who asked on each group and trigger this call pauses.
public virtual ValueTask PauseAllWith(PauseDetails? details, CancellationToken cancellationToken = default)
Parameters
detailsPauseDetailsWhy, and who asked; null for the reasonless pause.
cancellationTokenCancellationTokenThe cancellation instruction.
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.
PauseJob(JobKey, CancellationToken)
public virtual ValueTask<bool> PauseJob(JobKey jobKey, CancellationToken cancellationToken = default)
Parameters
jobKeyJobKeycancellationTokenCancellationToken
Returns
- ValueTask<bool>
true if the job exists — including a job that currently has no triggers — false if there is no job with the given key.
PauseJobGroups(GroupMatcher<JobKey>, CancellationToken)
public virtual ValueTask<List<string>> PauseJobGroups(GroupMatcher<JobKey> matcher, CancellationToken cancellationToken = default)
Parameters
matcherGroupMatcher<JobKey>cancellationTokenCancellationToken
Returns
Remarks
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. That memory is what this answers with — the names of the groups now recorded as paused, which is not the set of keys that moved: an equality matcher records a group that holds no job yet.
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 virtual ValueTask<List<string>> PauseJobGroupsWith(GroupMatcher<JobKey> matcher, PauseDetails? details, CancellationToken cancellationToken = default)
Parameters
matcherGroupMatcher<JobKey>The groups to pause.
detailsPauseDetailsWhy, and who asked; null for the reasonless pause.
cancellationTokenCancellationTokenThe 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 virtual ValueTask<bool> PauseJobWith(JobKey jobKey, PauseDetails? details, CancellationToken cancellationToken = default)
Parameters
jobKeyJobKeyThe job whose triggers to pause.
detailsPauseDetailsWhy, and who asked; null for the reasonless pause.
cancellationTokenCancellationTokenThe 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)
public virtual ValueTask<List<JobKey>> PauseJobs(IReadOnlyCollection<JobKey> jobKeys, CancellationToken cancellationToken = default)
Parameters
jobKeysIReadOnlyCollection<JobKey>cancellationTokenCancellationToken
Returns
- ValueTask<List<JobKey>>
The keys this call found, in the order they were given — a job with no triggers is found and so is present. 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
PauseJobsWith(IReadOnlyCollection<JobKey>, PauseDetails?, CancellationToken)
PauseJobs(IReadOnlyCollection<JobKey>, CancellationToken), recording why and who asked on each trigger of the jobs this call pauses.
public virtual ValueTask<List<JobKey>> PauseJobsWith(IReadOnlyCollection<JobKey> jobKeys, PauseDetails? details, CancellationToken cancellationToken = default)
Parameters
jobKeysIReadOnlyCollection<JobKey>The jobs whose triggers to pause.
detailsPauseDetailsWhy, and who asked; null for the reasonless pause.
cancellationTokenCancellationTokenThe 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 key.
public virtual ValueTask<bool> PauseTrigger(TriggerKey triggerKey, CancellationToken cancellationToken = default)
Parameters
triggerKeyTriggerKeycancellationTokenCancellationToken
Returns
- ValueTask<bool>
true if the trigger exists and was moved into the paused state by this call, false if there is no trigger with the given key, it was already paused, or it is in a state that cannot be paused (e.g. complete).
PauseTriggerGroups(GroupMatcher<TriggerKey>, CancellationToken)
Pause the trigger groups that match, and every ITrigger in them.
public virtual ValueTask<List<string>> PauseTriggerGroups(GroupMatcher<TriggerKey> matcher, CancellationToken cancellationToken = default)
Parameters
matcherGroupMatcher<TriggerKey>cancellationTokenCancellationToken
Returns
Remarks
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. That memory is what this answers with — the names of the groups now recorded as paused, which is not the set of keys that moved: an equality matcher records a group that holds no trigger yet.
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 virtual ValueTask<List<string>> PauseTriggerGroupsWith(GroupMatcher<TriggerKey> matcher, PauseDetails? details, CancellationToken cancellationToken = default)
Parameters
matcherGroupMatcher<TriggerKey>The groups to pause.
detailsPauseDetailsWhy, and who asked; null for the reasonless pause.
cancellationTokenCancellationTokenThe 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 virtual ValueTask<bool> PauseTriggerWith(TriggerKey triggerKey, PauseDetails? details, CancellationToken cancellationToken = default)
Parameters
triggerKeyTriggerKeyThe trigger to pause.
detailsPauseDetailsWhy, and who asked; null for the reasonless pause.
cancellationTokenCancellationTokenThe 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)
Pause the ITriggers with the given keys.
public virtual ValueTask<List<TriggerKey>> PauseTriggers(IReadOnlyCollection<TriggerKey> triggerKeys, CancellationToken cancellationToken = default)
Parameters
triggerKeysIReadOnlyCollection<TriggerKey>cancellationTokenCancellationToken
Returns
- ValueTask<List<TriggerKey>>
The keys this call moved into the paused state, in the order they were given. A key that names no trigger, one that was already paused, and one in a state that cannot be paused are each 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
PauseTriggersWith(IReadOnlyCollection<TriggerKey>, PauseDetails?, CancellationToken)
PauseTriggers(IReadOnlyCollection<TriggerKey>, CancellationToken), recording why and who asked on each trigger this call pauses.
public virtual ValueTask<List<TriggerKey>> PauseTriggersWith(IReadOnlyCollection<TriggerKey> triggerKeys, PauseDetails? details, CancellationToken cancellationToken = default)
Parameters
triggerKeysIReadOnlyCollection<TriggerKey>The triggers to pause.
detailsPauseDetailsWhy, and who asked; null for the reasonless pause.
cancellationTokenCancellationTokenThe 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 virtual ValueTask<PagedResult<string>> QueryCalendarNames(CalendarQuery query, CancellationToken cancellationToken = default)
Parameters
queryCalendarQueryWhich names to select and which page of them to return.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
QueryClusterNodes(CancellationToken)
Lists the scheduler nodes this store knows about, as ClusterNodes: the current node first, then the rest by instance id (ordinal).
public virtual ValueTask<List<ClusterNode>> QueryClusterNodes(CancellationToken cancellationToken = default)
Parameters
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
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 virtual ValueTask<PagedResult<FireInstance>> QueryFireInstances(FireInstanceQuery query, CancellationToken cancellationToken = default)
Parameters
queryFireInstanceQueryWhat to select and which page of it to return.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
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 virtual ValueTask<PagedResult<JobGroup>> QueryJobGroups(JobGroupQuery query, CancellationToken cancellationToken = default)
Parameters
queryJobGroupQueryWhat to select and which page of it to return.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
QueryJobs(JobQuery, CancellationToken)
Lists jobs matching the query, as JobHeaders, ordered by group and then name (ordinal).
public virtual ValueTask<PagedResult<JobHeader>> QueryJobs(JobQuery query, CancellationToken cancellationToken = default)
Parameters
queryJobQueryWhat to select and which page of it to return.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
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 virtual ValueTask<PagedResult<TriggerGroup>> QueryTriggerGroups(TriggerGroupQuery query, CancellationToken cancellationToken = default)
Parameters
queryTriggerGroupQueryWhat to select and which page of it to return.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
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 virtual ValueTask<PagedResult<TriggerHeader>> QueryTriggers(TriggerQuery query, CancellationToken cancellationToken = default)
Parameters
queryTriggerQueryWhat to select and which page of it to return.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
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 virtual ValueTask ReleaseAcquiredTrigger(IOperableTrigger trigger, CancellationToken cancellationToken = default)
Parameters
triggerIOperableTriggercancellationTokenCancellationToken
Returns
ReplaceTrigger(TriggerKey, IOperableTrigger, CancellationToken)
Remove (delete) the ITrigger with the given name, and store the new given one - which must be associated with the same job.
public virtual ValueTask<bool> ReplaceTrigger(TriggerKey triggerKey, IOperableTrigger trigger, CancellationToken cancellationToken = default)
Parameters
triggerKeyTriggerKeyThe ITrigger to be replaced.
triggerIOperableTriggerThe new ITrigger to be stored.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
RequestInterrupt(string, CancellationToken)
Records a request that a running firing be interrupted, on the firing's own record, for the node running it to act on.
public virtual ValueTask<bool> RequestInterrupt(string fireInstanceId, CancellationToken cancellationToken = default)
Parameters
fireInstanceIdstringThe firing, as FireInstanceId names it.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
Remarks
A clustered store's way of reaching a firing on another node. The scheduler calls this from Interrupt(JobKey, CancellationToken) and InterruptFireInstance(string, CancellationToken), only when Clustered is true, for each executing firing it could not interrupt itself. The node running the firing reads its requests through GetInterruptRequests(CancellationToken) and cancels the job's token as a local interrupt does. A request is not an error when the firing has completed: there is nothing to record it on, and the answer is false.
A default interface member, added in 4.6. The default records nothing and answers false, so that store's interrupts stay with the node they are asked of.
ResetTriggerFromErrorState(TriggerKey, CancellationToken)
public virtual ValueTask<bool> ResetTriggerFromErrorState(TriggerKey triggerKey, CancellationToken cancellationToken = default)
Parameters
triggerKeyTriggerKeycancellationTokenCancellationToken
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)
public virtual ValueTask<List<TriggerKey>> ResetTriggersFromErrorState(IReadOnlyCollection<TriggerKey> triggerKeys, CancellationToken cancellationToken = default)
Parameters
triggerKeysIReadOnlyCollection<TriggerKey>cancellationTokenCancellationToken
Returns
- ValueTask<List<TriggerKey>>
The keys this call reset, in the order they were given. A key that names no trigger, or one that was not in the error state, 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
ResumeAll(CancellationToken)
Resume (un-pause) all triggers - equivalent of calling ResumeTriggerGroups(GroupMatcher<TriggerKey>, CancellationToken) on every group.
If any ITrigger missed one or more fire-times, then the ITrigger's misfire instruction will be applied.
public virtual ValueTask ResumeAll(CancellationToken cancellationToken = default)
Parameters
cancellationTokenCancellationToken
Returns
- See Also
ResumeJob(JobKey, CancellationToken)
Resume (un-pause) the IJob with the given key.
If any of the IJob'sITrigger s missed one or more fire-times, then the ITrigger's misfire instruction will be applied.
public virtual ValueTask<bool> ResumeJob(JobKey jobKey, CancellationToken cancellationToken = default)
Parameters
jobKeyJobKeycancellationTokenCancellationToken
Returns
- ValueTask<bool>
true if the job exists — including a job that currently has no triggers — false if there is no job with the given key.
ResumeJobGroups(GroupMatcher<JobKey>, CancellationToken)
Resume (un-pause) the job groups that match, and the IJobs in them.
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 virtual ValueTask<List<string>> ResumeJobGroups(GroupMatcher<JobKey> matcher, CancellationToken cancellationToken = default)
Parameters
matcherGroupMatcher<JobKey>cancellationTokenCancellationToken
Returns
ResumeJobs(IReadOnlyCollection<JobKey>, CancellationToken)
Resume (un-pause) the IJobs with the given keys.
public virtual ValueTask<List<JobKey>> ResumeJobs(IReadOnlyCollection<JobKey> jobKeys, CancellationToken cancellationToken = default)
Parameters
jobKeysIReadOnlyCollection<JobKey>cancellationTokenCancellationToken
Returns
- ValueTask<List<JobKey>>
The keys this call found, in the order they were given — a job with no triggers is found and so is present. A key that names no job is simply absent — the plural of the single-key bool, not a failure.
Remarks
If any of the jobs' ITriggers missed one or more fire-times, then those triggers' misfire instructions will be applied.
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
ResumeTrigger(TriggerKey, CancellationToken)
Resume (un-pause) the ITrigger with the given key.
If the ITrigger missed one or more fire-times, then the ITrigger's misfire instruction will be applied.
public virtual ValueTask<bool> ResumeTrigger(TriggerKey triggerKey, CancellationToken cancellationToken = default)
Parameters
triggerKeyTriggerKeycancellationTokenCancellationToken
Returns
- ValueTask<bool>
true if the trigger existed in a paused state and was resumed by this call, false if there is no trigger with the given key or it was not paused.
ResumeTriggerGroups(GroupMatcher<TriggerKey>, CancellationToken)
Resume (un-pause) the trigger groups that match, and every ITrigger in them.
If any ITrigger missed one or more fire-times, then the ITrigger's misfire instruction will be applied.
public virtual ValueTask<List<string>> ResumeTriggerGroups(GroupMatcher<TriggerKey> matcher, CancellationToken cancellationToken = default)
Parameters
matcherGroupMatcher<TriggerKey>cancellationTokenCancellationToken
Returns
ResumeTriggers(IReadOnlyCollection<TriggerKey>, CancellationToken)
Resume (un-pause) the ITriggers with the given keys.
public virtual ValueTask<List<TriggerKey>> ResumeTriggers(IReadOnlyCollection<TriggerKey> triggerKeys, CancellationToken cancellationToken = default)
Parameters
triggerKeysIReadOnlyCollection<TriggerKey>cancellationTokenCancellationToken
Returns
- ValueTask<List<TriggerKey>>
The keys this call resumed, in the order they were given. A key that names no trigger, and one that was not paused, are each simply absent — the plural of the single-key bool, not a failure.
Remarks
If a ITrigger missed one or more fire-times, then its misfire instruction will be applied.
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
ScheduleJob(IJobDetail, IOperableTrigger, CancellationToken)
Store the given IJobDetail and ITrigger.
public virtual ValueTask ScheduleJob(IJobDetail job, IOperableTrigger trigger, CancellationToken cancellationToken = default)
Parameters
jobIJobDetailThe IJobDetail to be stored.
triggerIOperableTriggerThe ITrigger to be stored.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
Exceptions
- ObjectAlreadyExistsException
A job or a trigger is already stored under one of the two keys. Nothing is stored.
ScheduleJobs(IReadOnlyDictionary<IJobDetail, IReadOnlyCollection<IOperableTrigger>>, ScheduleJobOptions, CancellationToken)
Store all the given jobs with their related triggers.
public virtual ValueTask ScheduleJobs(IReadOnlyDictionary<IJobDetail, IReadOnlyCollection<IOperableTrigger>> triggersAndJobs, ScheduleJobOptions options = default, CancellationToken cancellationToken = default)
Parameters
triggersAndJobsIReadOnlyDictionary<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.
optionsScheduleJobOptionsHow 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.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
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 virtual ValueTask SchedulerPaused(CancellationToken cancellationToken = default)
Parameters
cancellationTokenCancellationToken
Returns
SchedulerResumed(CancellationToken)
Called by the QuartzScheduler to inform the JobStore that the scheduler has resumed after being paused.
public virtual ValueTask SchedulerResumed(CancellationToken cancellationToken = default)
Parameters
cancellationTokenCancellationToken
Returns
SchedulerStarted(CancellationToken)
Called by the QuartzScheduler to inform the IJobStore that the scheduler has started.
public virtual ValueTask SchedulerStarted(CancellationToken cancellationToken = default)
Parameters
cancellationTokenCancellationToken
Returns
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 virtual ValueTask Shutdown(CancellationToken cancellationToken = default)
Parameters
cancellationTokenCancellationToken
Returns
StoreTrigger(IOperableTrigger, TriggerConflict, CancellationToken)
Store the given trigger, deciding what becomes of one already stored under its key, and say which it was.
public virtual ValueTask<ScheduleTriggerResult> StoreTrigger(IOperableTrigger trigger, TriggerConflict onConflict, CancellationToken cancellationToken = default)
Parameters
triggerIOperableTriggerThe trigger to store, its first fire time already computed.
onConflictTriggerConflictWhat to do when a trigger is stored under the same key.
cancellationTokenCancellationTokenThe 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
onConflictis 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 virtual ValueTask TriggeredJobComplete(IOperableTrigger trigger, IJobDetail jobDetail, SchedulerInstruction triggerInstructionCode, CancellationToken cancellationToken = default)
Parameters
triggerIOperableTriggerjobDetailIJobDetailtriggerInstructionCodeSchedulerInstructioncancellationTokenCancellationToken
Returns
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 virtual ValueTask<List<TriggerFiredResult>> TriggersFired(IReadOnlyCollection<IOperableTrigger> triggers, CancellationToken cancellationToken = default)
Parameters
triggersIReadOnlyCollection<IOperableTrigger>cancellationTokenCancellationToken
Returns
- ValueTask<List<TriggerFiredResult>>
May return null if all the triggers or their calendars no longer exist, or if the trigger was not successfully put into the 'executing' state. Preference is to return an empty list if none of the triggers could be fired.
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 virtual ValueTask UpdateFireInstanceProgress(string fireInstanceId, FireInstanceProgress progress, CancellationToken cancellationToken = default)
Parameters
fireInstanceIdstringThe firing, as FireInstanceId names it.
progressFireInstanceProgressWhat the firing reported.
cancellationTokenCancellationTokenThe cancellation instruction.
Returns
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 virtual ValueTask<bool> UpdateTriggerDetails(TriggerKey triggerKey, TriggerDetailsUpdate update, CancellationToken cancellationToken = default)
Parameters
triggerKeyTriggerKeyThe key identifying the trigger to update.
updateTriggerDetailsUpdateThe details to update. Only properties explicitly set will be changed. May include the calendar name and the misfire instruction, which can affect firing behavior.
cancellationTokenCancellationTokenThe cancellation instruction.