Documentation
¶
Overview ¶
Package cron is a cron scheduler.
Register jobs with Add or AddSchedule, then call Start. Stop cancels the loop and waits for in-flight jobs, capped by its context.
Specs use five fields. WithSeconds adds an optional leading seconds field; WithSeconds(true) requires six.
Subpackages ¶
- wrap: job wrappers (Recover, Timeout, SkipIfRunning, DelayIfRunning, Retry).
- workflow: DAG jobs with conditional dependencies.
- parserext: Quartz tokens (L, N#M, NL).
Index ¶
- Variables
- func Between(s Schedule, start, end time.Time) []time.Time
- func FireKey(name string, id EntryID, scheduledAt time.Time) string
- func IsTriggered(s Schedule) bool
- func NextN(s Schedule, from time.Time, n int) []time.Time
- func ValidateSpec(spec string) error
- func ValidateSpecWith(spec string, p Parser) error
- type AlignedDelay
- type ConstantDelay
- type Cron
- func (c *Cron) Add(spec string, j Job, opts ...EntryOption) (EntryID, error)
- func (c *Cron) AddSchedule(s Schedule, j Job, opts ...EntryOption) (EntryID, error)
- func (c *Cron) Drain(ctx context.Context) error
- func (c *Cron) Entries() iter.Seq[Entry]
- func (c *Cron) Entry(id EntryID) (Entry, bool)
- func (c *Cron) Pause(id EntryID) bool
- func (c *Cron) Remove(id EntryID) bool
- func (c *Cron) Resume(id EntryID) bool
- func (c *Cron) Running() bool
- func (c *Cron) Start() error
- func (c *Cron) Stop(ctx context.Context) error
- func (c *Cron) Trigger(id EntryID) error
- func (c *Cron) TriggerAndWait(ctx context.Context, id EntryID) error
- func (c *Cron) TriggerByName(name string) (int, error)
- func (c *Cron) Update(id EntryID, spec string) error
- func (c *Cron) UpdateSchedule(id EntryID, s Schedule) error
- type Elector
- type Entry
- type EntryID
- type EntryInfo
- type EntryOption
- func WithEntryChain(wrappers ...Wrapper) EntryOption
- func WithEntryJitter(max time.Duration) EntryOption
- func WithEntryLocker(l Locker) EntryOption
- func WithEntryMissedFire(p MissedFirePolicy) EntryOption
- func WithEntryRetry(p RetryPolicy) EntryOption
- func WithLastRun(t time.Time) EntryOption
- func WithName(name string) EntryOption
- func WithTimeout(d time.Duration) EntryOption
- type EventJobComplete
- type EventJobStart
- type EventMissed
- type EventSchedule
- type EventSkipped
- type HookDroppedRecorder
- type Job
- type JobCompleteHook
- type JobCompletedRecorder
- type JobFunc
- type JobMissedRecorder
- type JobScheduledRecorder
- type JobSkippedRecorder
- type JobStartHook
- type JobStartedRecorder
- type Locker
- type MemoryElector
- type MemoryLocker
- type MissedFirePolicy
- type MissedHook
- type Option
- func WithBaseContext(ctx context.Context) Option
- func WithChain(wrappers ...Wrapper) Option
- func WithElector(e Elector) Option
- func WithHookBuffer(n int) Option
- func WithHooks(hooks ...any) Option
- func WithJitter(max time.Duration) Option
- func WithLocation(loc *time.Location) Option
- func WithLocker(l Locker) Option
- func WithLogger(l *slog.Logger) Option
- func WithMaxConcurrent(n int) Option
- func WithMaxEntries(n int) Option
- func WithMissedFire(p MissedFirePolicy) Option
- func WithMissedTolerance(d time.Duration) Option
- func WithParser(p Parser) Option
- func WithRecorder(r any) Option
- func WithRetry(p RetryPolicy) Option
- func WithSecondsField() Option
- func WithoutRecover() Option
- type ParseError
- type Parser
- type ParserOption
- type QueueDepthRecorder
- type ReleaseFunc
- type RetryOption
- type RetryPolicy
- type Schedule
- type ScheduleHook
- type SkipHook
- type SkipReason
- type SpecAnalysis
- type SpecSchedule
- type StandardParser
- type Upcoming
- type Wrapper
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( ErrCapacityReached = errors.New("cron: capacity reached") ErrAlreadyRunning = errors.New("cron: job already running") ErrJobTimeout = errors.New("cron: job timeout") ErrCronStopping = errors.New("cron: scheduler stopping") ErrEntryNotFound = errors.New("cron: entry not found") ErrSchedulerNotRunning = errors.New("cron: scheduler not running") ErrConcurrencyLimit = errors.New("cron: max concurrent reached") ErrSchedulerStopped = errors.New("cron: scheduler stopped") ErrNilJob = errors.New("cron: nil job") ErrNilSchedule = errors.New("cron: nil schedule") ErrJobPanic = errors.New("cron: job panicked") ErrLockHeld = errors.New("cron: fire lock held by another instance") ErrNotLeader = errors.New("cron: not leader") ErrLockerRequiresName = errors.New("cron: distributed locker requires WithName") )
Functions ¶
func FireKey ¶ added in v0.3.0
FireKey is the coordination key for one fire of one entry: "<name>@<unix-nanos>". Nanosecond precision matches the scheduler's heap, so custom sub-second Schedules never collapse two legitimate fires into one claim. Including the scheduled time makes every fire — including each MissedRunOnce/MissedRunAll catch-up instant — its own claim, so deduplication depends on neither lock hold duration nor clock agreement between instances.
The name is the cross-instance component and is required for locked entries (see ErrLockerRequiresName): it must uniquely identify a job, and entries sharing a name share claims for coinciding instants. The "#<id>" fallback exists only for direct callers; the scheduler never registers a locked entry without a name.
func IsTriggered ¶
IsTriggered reports whether s came from TriggeredSchedule.
func ValidateSpec ¶
ValidateSpec returns nil iff spec parses with the standard parser.
func ValidateSpecWith ¶
ValidateSpecWith is ValidateSpec with a custom parser.
Types ¶
type AlignedDelay ¶ added in v0.5.1
AlignedDelay is a fixed-interval Schedule aligned to the Unix epoch: every instance computes identical fire instants, which makes it the right interval schedule under a distributed Locker. ConstantDelay, by contrast, anchors its phase at Add time, so staggered instances never share fire keys. Non-positive intervals never fire.
func (AlignedDelay) String ¶ added in v0.5.1
func (d AlignedDelay) String() string
type ConstantDelay ¶
ConstantDelay is a fixed-interval Schedule. The interval has a 1s floor: sub-second durations fire every 1s. Whole-second intervals are aligned to the second boundary; fractional intervals (e.g. 1500ms) keep their exact period.
func (ConstantDelay) String ¶
func (d ConstantDelay) String() string
type Cron ¶
type Cron struct {
// contains filtered or unexported fields
}
Cron is a job scheduler. Construct one with New, register jobs, then Start.
func (*Cron) Add ¶
Add parses spec and registers j. It returns a *ParseError for invalid specs or ErrCapacityReached when WithMaxEntries rejects the registration.
func (*Cron) AddSchedule ¶
AddSchedule registers j against a programmatic Schedule.
func (*Cron) Drain ¶ added in v0.3.0
Drain is Stop without cancelling in-flight jobs: it stops scheduling new fires and waits for running jobs to finish naturally, capped by ctx.
func (*Cron) Pause ¶ added in v0.3.0
Pause suspends automatic fires for id, keeping the entry and its Prev. Manual Trigger still works while paused. Returns false if id is unknown.
func (*Cron) Remove ¶
Remove deregisters id. In-flight invocations continue; future automatic fires and future Trigger calls for id are rejected.
func (*Cron) Resume ¶ added in v0.3.0
Resume re-enables automatic fires for id, scheduling from now. Returns false if id is unknown.
func (*Cron) Running ¶
Running reports whether the scheduler is running. It is observational; use Trigger's returned error for race-free dispatch decisions.
func (*Cron) Start ¶
Start launches the scheduler. It is idempotent while running and returns ErrSchedulerStopped after Stop has been called.
func (*Cron) Stop ¶
Stop halts the scheduler, cancels in-flight jobs (ErrCronStopping as the cause), and waits for the loop, jobs and hook dispatcher to drain, capped by ctx. Returns ctx.Err() on timeout. Do not call it from inside a Job.
func (*Cron) Trigger ¶
Trigger fires id immediately, bypassing jitter. It returns ErrSchedulerNotRunning, ErrEntryNotFound, or ErrConcurrencyLimit when dispatch is rejected. Paused entries can still be triggered.
func (*Cron) TriggerAndWait ¶ added in v0.3.0
TriggerAndWait fires id like Trigger and blocks until the invocation returns, yielding the job's error. ctx bounds only the wait; on ctx cancellation the job keeps running.
func (*Cron) TriggerByName ¶
TriggerByName fires every entry whose Name matches name. Returns the successful dispatch count and errors.Join of per-Trigger failures. No match returns (0, nil); not running returns (0, ErrSchedulerNotRunning).
type Elector ¶ added in v0.3.0
Elector reports whether this instance should run scheduled jobs. nil means leader: run. Any error — including backend failures — means skip (fail-closed: during an outage nobody fires). Backends return an error wrapping ErrNotLeader when another instance holds leadership.
type Entry ¶
type Entry struct {
ID EntryID
Name string
Spec string // empty for AddSchedule entries
Schedule Schedule
Prev time.Time // zero if never fired
Next time.Time // zero if exhausted, paused, or TriggeredSchedule
Paused bool
}
Entry is the public read-only view of a scheduled item. Safe to copy.
type EntryInfo ¶ added in v0.4.0
EntryInfo identifies the running invocation inside a job's context.
func EntryInfoFromContext ¶ added in v0.4.0
EntryInfoFromContext returns the identity of the entry whose job is running under ctx. The scheduler injects it for every dispatch, so wrappers and jobs can tell which entry — and which fire — they serve.
type EntryOption ¶
type EntryOption func(*entryConfig)
EntryOption configures one entry.
func WithEntryChain ¶
func WithEntryChain(wrappers ...Wrapper) EntryOption
WithEntryChain installs per-entry wrappers inside the global chain.
func WithEntryJitter ¶ added in v0.3.0
func WithEntryJitter(max time.Duration) EntryOption
WithEntryJitter overrides the scheduler's jitter for one entry. Zero disables jitter for the entry.
func WithEntryLocker ¶ added in v0.3.0
func WithEntryLocker(l Locker) EntryOption
WithEntryLocker overrides the scheduler's Locker for one entry. An explicit nil disables distributed locking for the entry.
func WithEntryMissedFire ¶ added in v0.3.0
func WithEntryMissedFire(p MissedFirePolicy) EntryOption
WithEntryMissedFire overrides the scheduler's missed-fire policy for one entry.
func WithEntryRetry ¶
func WithEntryRetry(p RetryPolicy) EntryOption
WithEntryRetry overrides the global retry for one entry. A zero policy disables retry for that entry.
func WithLastRun ¶ added in v0.3.0
func WithLastRun(t time.Time) EntryOption
WithLastRun seeds the entry's schedule anchor, usually the persisted time of the last run before a restart. The first fire is computed from t instead of now, so a missed-fire policy can catch up work missed while the process was down. It also seeds Entry.Prev.
func WithTimeout ¶
func WithTimeout(d time.Duration) EntryOption
WithTimeout caps a Job's runtime with ErrJobTimeout as the cancel cause.
type EventJobComplete ¶
type EventJobComplete struct {
EntryID EntryID
Name string
ScheduledAt time.Time
FireAt time.Time
Duration time.Duration
Err error
}
EventJobComplete is emitted after the chain returns. Err is the chain result.
type EventJobStart ¶
EventJobStart is emitted just before the chain runs. ScheduledAt is the schedule-selected time; FireAt is the actual start time after jitter/queueing.
type EventMissed ¶
type EventMissed struct {
EntryID EntryID
Name string
ScheduledAt time.Time
Lateness time.Duration
Policy MissedFirePolicy
}
EventMissed is emitted for missed fires and MaxConcurrent rejections.
type EventSchedule ¶
EventSchedule is emitted when an entry is added or its next firing is recomputed after a fire.
type EventSkipped ¶ added in v0.3.0
type EventSkipped struct {
EntryID EntryID
Name string
ScheduledAt time.Time
Reason SkipReason
Err error // wraps ErrLockHeld / ErrNotLeader, or the backend error
}
EventSkipped is emitted when distributed coordination suppresses a fire.
type HookDroppedRecorder ¶
type HookDroppedRecorder interface{ HookDropped() }
type JobCompleteHook ¶
type JobCompleteHook interface{ OnJobComplete(EventJobComplete) }
type JobCompletedRecorder ¶
type JobFunc ¶
JobFunc adapts a function to Job.
Example ¶
package main
import (
"context"
"fmt"
"github.com/libtnb/cron"
)
func main() {
j := cron.JobFunc(func(ctx context.Context) error {
fmt.Println("hello")
return nil
})
_ = j.Run(context.Background())
}
Output: hello
type JobMissedRecorder ¶
type JobScheduledRecorder ¶
type JobScheduledRecorder interface{ JobScheduled(name string) }
type JobSkippedRecorder ¶ added in v0.3.0
type JobSkippedRecorder interface {
JobSkipped(name string, reason SkipReason)
}
type JobStartHook ¶
type JobStartHook interface{ OnJobStart(EventJobStart) }
type JobStartedRecorder ¶
type JobStartedRecorder interface{ JobStarted(name string) }
type Locker ¶ added in v0.3.0
type Locker interface {
Lock(ctx context.Context, key string) (ReleaseFunc, error)
}
Locker coordinates fires across scheduler instances. Lock claims key (see FireKey); exactly one instance in the fleet succeeds per key. On failure it returns an error wrapping ErrLockHeld when another instance holds the claim, or any other error for backend failures — either way the fire is skipped on this instance (fail-closed) and EventSkipped is emitted.
Implementations own TTL and acquisition-timeout policy; the ctx passed in is the scheduler's run context (cancelled on Stop), not a per-call deadline. Implementations should retain a claim until its TTL even after release: deleting the key on release re-opens the duplicate window that fire-scoped keys close (an instance with a larger jitter draw could still attempt the same fire). The TTL must exceed max jitter + clock skew + any catch-up horizon within which the same instant may be re-attempted.
Exactly-once requires schedules whose instants match across instances: cron expressions, OnceAt, and AlignedDelay qualify; ConstantDelay's phase is per-process.
type MemoryElector ¶ added in v0.3.0
type MemoryElector struct {
// contains filtered or unexported fields
}
MemoryElector is a settable Elector for tests and single-process use. A new MemoryElector starts as leader.
func NewMemoryElector ¶ added in v0.3.0
func NewMemoryElector() *MemoryElector
func (*MemoryElector) IsLeader ¶ added in v0.3.0
func (e *MemoryElector) IsLeader(context.Context) error
func (*MemoryElector) SetLeader ¶ added in v0.3.0
func (e *MemoryElector) SetLeader(leader bool)
SetLeader flips this instance's leadership.
type MemoryLocker ¶ added in v0.3.0
type MemoryLocker struct {
// contains filtered or unexported fields
}
MemoryLocker is a process-local Locker for tests and single-process composition. Unlike backend lockers it does not retain claims after release: a single scheduler never dispatches the same fire twice, so in-process retention is unnecessary. It is not a substitute for a backend locker across processes.
func NewMemoryLocker ¶ added in v0.3.0
func NewMemoryLocker() *MemoryLocker
func (*MemoryLocker) Lock ¶ added in v0.3.0
func (l *MemoryLocker) Lock(_ context.Context, key string) (ReleaseFunc, error)
type MissedFirePolicy ¶
type MissedFirePolicy uint8
MissedFirePolicy controls behaviour when a fire is later than WithMissedTolerance. OnMissedFire fires regardless of policy.
const ( // MissedSkip ignores missed firings and resumes from the next // scheduled time. This is the default. MissedSkip MissedFirePolicy = iota // MissedRunOnce runs the job once for the most recent missed firing // (latest schedule.Next <= now), then resumes normally. MissedRunOnce // MissedRunAll runs the job once per missed firing (newest // missedRunAllCap kept), then resumes normally. MissedRunAll )
func (MissedFirePolicy) String ¶
func (p MissedFirePolicy) String() string
type MissedHook ¶
type MissedHook interface{ OnMissedFire(EventMissed) }
type Option ¶
type Option func(*config)
Option configures a Cron.
func WithBaseContext ¶ added in v0.3.0
WithBaseContext sets the root context jobs inherit from. Cancelling it stops firing and cancels in-flight jobs, like Stop but without waiting.
func WithElector ¶ added in v0.3.0
WithElector gates automatic fires on leadership: any IsLeader error skips the fire on this instance. Manual Trigger bypasses it.
func WithHookBuffer ¶
WithHookBuffer sets the hook event buffer size. Full buffers drop new events.
func WithHooks ¶
WithHooks installs async hook subscribers. Values may implement any subset of ScheduleHook, JobStartHook, JobCompleteHook, and MissedHook.
func WithJitter ¶
WithJitter adds a random delay in [0, max) to each firing.
func WithLocation ¶
WithLocation sets the default schedule timezone. Default is time.Local. Ignored when WithParser is set: a custom parser owns its timezone.
func WithLocker ¶ added in v0.3.0
WithLocker sets the distributed Locker every automatic fire must claim (see FireKey). On failure the fire is skipped on this instance and EventSkipped is emitted. Manual Trigger bypasses it.
func WithLogger ¶
WithLogger sets the slog.Logger. Default slog.Default().
func WithMaxConcurrent ¶
WithMaxConcurrent caps in-flight jobs. Zero means unlimited.
func WithMaxEntries ¶
WithMaxEntries caps registered entries. Zero means unlimited.
func WithMissedFire ¶
func WithMissedFire(p MissedFirePolicy) Option
WithMissedFire selects the missed-fire policy. Default MissedSkip.
func WithMissedTolerance ¶
WithMissedTolerance sets the lateness threshold for "missed". Default 1s.
func WithParser ¶
WithParser installs a parser. It takes over timezone resolution, so WithLocation and WithSecondsField no longer apply.
func WithRecorder ¶
WithRecorder installs a metrics subscriber. Values may implement any subset of the recorder sub-interfaces. Methods are called concurrently from job goroutines, the scheduler loop, and Add/Remove/Trigger callers; they must be concurrency-safe and non-blocking.
func WithRetry ¶
func WithRetry(p RetryPolicy) Option
WithRetry sets the default RetryPolicy. Overridden by WithEntryRetry.
func WithSecondsField ¶ added in v0.2.2
func WithSecondsField() Option
WithSecondsField enables a leading seconds field in the built-in parser, so the common seconds + WithLocation case composes without WithParser.
func WithoutRecover ¶ added in v0.3.0
func WithoutRecover() Option
WithoutRecover disables the built-in job panic recovery. By default a panicking job is recovered into an ErrJobPanic-wrapped error; with this option the panic propagates and crashes the process.
type ParseError ¶
type ParseError struct {
Spec string
Field string // e.g. "minute"; "" if not applicable
Pos int // 0-based byte offset; -1 if unknown
Reason string
Err error
}
ParseError describes a failure parsing a cron specification.
func (*ParseError) Error ¶
func (e *ParseError) Error() string
func (*ParseError) Unwrap ¶
func (e *ParseError) Unwrap() error
type ParserOption ¶
type ParserOption func(*parserConfig)
ParserOption configures NewStandardParser.
func WithDefaultLocation ¶
func WithDefaultLocation(loc *time.Location) ParserOption
WithDefaultLocation sets the default timezone for specs without TZ=/CRON_TZ=. nil means time.Local.
func WithParserExt ¶
func WithParserExt(ext Parser) ParserOption
WithParserExt installs a pre-parse hook. Returning (nil, nil) falls through to the standard parser.
func WithSeconds ¶
func WithSeconds(strict ...bool) ParserOption
WithSeconds enables a leading seconds field. By default the parser accepts both 5- and 6-field specs (a 5-field spec is parsed with second=0). Pass true to require exactly 6 fields.
type QueueDepthRecorder ¶
type QueueDepthRecorder interface{ QueueDepth(n int) }
type ReleaseFunc ¶ added in v0.3.0
ReleaseFunc releases a lock acquired by a Locker. Implementations must be idempotent. The scheduler calls it with a short-deadline context detached from the job's context, so job cancellation never prevents release.
type RetryOption ¶
type RetryOption func(*RetryPolicy)
RetryOption configures a RetryPolicy built by Retry.
func RetryInitial ¶
func RetryInitial(d time.Duration) RetryOption
RetryInitial sets the first retry delay (default 1s).
func RetryJitterFrac ¶
func RetryJitterFrac(f float64) RetryOption
RetryJitterFrac is fractional uniform jitter (e.g. 0.1 = ±10%).
func RetryMaxDelay ¶
func RetryMaxDelay(d time.Duration) RetryOption
RetryMaxDelay caps backoff (zero = uncapped).
func RetryMultiplier ¶
func RetryMultiplier(m float64) RetryOption
RetryMultiplier is the per-attempt growth factor (<=1 stays constant).
type RetryPolicy ¶
type RetryPolicy struct {
MaxRetries int
Initial time.Duration
MaxDelay time.Duration
Multiplier float64
JitterFrac float64
}
RetryPolicy describes exponential backoff with optional jitter. MaxRetries == 0 disables retry; negative means unlimited until ctx cancellation. Fields are exported for config-driven assembly; use Retry(...) for programmatic construction.
func Retry ¶
func Retry(maxRetries int, opts ...RetryOption) RetryPolicy
Retry builds a RetryPolicy. maxRetries is the number of retries after the initial attempt; negative retries until ctx cancellation.
func (RetryPolicy) IsZero ¶
func (p RetryPolicy) IsZero() bool
IsZero is keyed only on MaxRetries so half-filled policies (e.g. only Initial set) don't produce a useless wrapper.
func (RetryPolicy) Wrapper ¶
func (p RetryPolicy) Wrapper() Wrapper
Wrapper returns a Wrapper that retries on error per p. Attempt errors are joined via errors.Join; ctx cancellation aborts, recording context.Cause so ErrJobTimeout / ErrCronStopping survive into the joined error.
type Schedule ¶
Schedule yields successive firing times. Next must return the first firing strictly after now, or zero when exhausted.
func Filter ¶ added in v0.3.0
Filter wraps s, skipping firings for which keep returns false — e.g. a holiday calendar. A nil keep passes everything through. The search gives up (returns zero) after filterScanCap consecutive rejections.
func OnceAt ¶ added in v0.3.0
OnceAt fires exactly once, at t. If t is already past, it never fires.
func TriggeredSchedule ¶
func TriggeredSchedule() Schedule
TriggeredSchedule never fires automatically. Combine with Trigger.
type ScheduleHook ¶
type ScheduleHook interface{ OnSchedule(EventSchedule) }
Hook sub-interfaces. WithHooks subscribers may implement any subset.
type SkipHook ¶ added in v0.3.0
type SkipHook interface{ OnSkipped(EventSkipped) }
type SkipReason ¶ added in v0.3.0
type SkipReason uint8
SkipReason classifies why distributed coordination suppressed a fire.
const ( SkipNotLeader SkipReason = iota // Elector returned an error SkipLockHeld // another instance claimed this fire SkipLockError // Locker backend failure (fail-closed) )
func (SkipReason) String ¶ added in v0.3.0
func (r SkipReason) String() string
type SpecAnalysis ¶
type SpecAnalysis struct {
Spec string
Valid bool
Err error
IsTriggered bool
Descriptor string // "@every", "@hourly", ... or "" for 5/6-field specs
Interval time.Duration // set when Descriptor == "@every"
Location *time.Location // schedule timezone
NextRun time.Time // upcoming firing relative to the now passed in
}
SpecAnalysis is the result of AnalyzeSpec. Most fields are populated only when Valid is true.
func AnalyzeSpec ¶
func AnalyzeSpec(spec string, now time.Time) SpecAnalysis
AnalyzeSpec parses spec and returns a structured description.
func AnalyzeSpecWith ¶
func AnalyzeSpecWith(spec string, p Parser, now time.Time) SpecAnalysis
AnalyzeSpecWith is AnalyzeSpec with a custom parser.
type SpecSchedule ¶
type SpecSchedule struct {
// contains filtered or unexported fields
}
SpecSchedule is a parsed cron expression.
func (*SpecSchedule) Location ¶
func (s *SpecSchedule) Location() *time.Location
Location returns the evaluation timezone.
func (*SpecSchedule) LogValue ¶
func (s *SpecSchedule) LogValue() slog.Value
func (*SpecSchedule) Next ¶
func (s *SpecSchedule) Next(t time.Time) time.Time
Next returns the next firing after t, or zero if none is found.
The hour branch reconstructs the wall clock at the target hour instead of adding an absolute (h-hour)*time.Hour, which would overshoot a DST spring-forward gap and skip the day. The minute/second branches keep their absolute jumps: they never straddle a whole-hour DST boundary, and stepping through the repeated hour on fall-back keeps both firings observable.
type StandardParser ¶
type StandardParser struct {
// contains filtered or unexported fields
}
StandardParser is stateless and concurrent-safe.
func NewStandardParser ¶
func NewStandardParser(opts ...ParserOption) *StandardParser
NewStandardParser handles 5/6-field specs, descriptors, and TZ prefixes.
type Wrapper ¶
Wrapper decorates a Job.
func Chain ¶
Chain composes wrappers so the first wraps outermost.
Example ¶
package main
import (
"context"
"fmt"
"github.com/libtnb/cron"
)
func main() {
mk := func(name string) cron.Wrapper {
return func(j cron.Job) cron.Job {
return cron.JobFunc(func(ctx context.Context) error {
fmt.Println("enter", name)
err := j.Run(ctx)
fmt.Println("leave", name)
return err
})
}
}
core := cron.JobFunc(func(ctx context.Context) error {
fmt.Println("run core")
return nil
})
_ = cron.Chain(mk("outer"), mk("inner"))(core).Run(context.Background())
}
Output: enter outer enter inner run core leave inner leave outer
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
_examples
|
|
|
hello
command
|
|
|
quartz
command
|
|
|
seconds
command
|
|
|
slog
command
|
|
|
workflow
command
|
|
|
internal
|
|
|
bitmask
Package bitmask provides bit-set scans shared by the schedule implementations.
|
Package bitmask provides bit-set scans shared by the schedule implementations. |
|
heap
Package heap provides a typed min-heap with addressable items.
|
Package heap provides a typed min-heap with addressable items. |
|
parsecache
Package parsecache memoises parser results.
|
Package parsecache memoises parser results. |
|
Package parserext provides optional cron parser extensions.
|
Package parserext provides optional cron parser extensions. |
|
Package workflow runs DAGs of cron.Jobs.
|
Package workflow runs DAGs of cron.Jobs. |
|
Package wrap supplies Job decorators.
|
Package wrap supplies Job decorators. |