Documentation
¶
Overview ¶
Package cron implements a cron spec parser and job runner.
Usage ¶
Callers may register Funcs to be invoked on a given schedule. Cron will run them in their own goroutines.
c := cron.New()
c.AddFunc("0 30 * * * *", func() { fmt.Println("Every hour on the half hour") })
c.AddFunc("@hourly", func() { fmt.Println("Every hour") })
c.AddFunc("@every 1h30m", func() { fmt.Println("Every hour thirty") })
c.Start()
..
// Funcs are invoked in their own goroutine, asynchronously.
...
// Funcs may also be added to a running Cron
c.AddFunc("@daily", func() { fmt.Println("Every day") })
..
// Inspect the cron job entries' next and previous run times.
inspect(c.Entries())
..
c.Stop() // Stop the scheduler (does not stop any jobs already running).
CRON Expression Format ¶
A cron expression represents a set of times, using 6 space-separated fields.
Field name | Mandatory? | Allowed values | Allowed special characters ---------- | ---------- | -------------- | -------------------------- Seconds | Yes | 0-59 | * / , - Minutes | Yes | 0-59 | * / , - Hours | Yes | 0-23 | * / , - Day of month | Yes | 1-31 | * / , - ? Month | Yes | 1-12 or JAN-DEC | * / , - Day of week | Yes | 0-6 or SUN-SAT | * / , - ?
Note: Month and Day-of-week field values are case insensitive. "SUN", "Sun", and "sun" are equally accepted.
Special Characters ¶
Asterisk ( * )
The asterisk indicates that the cron expression will match for all values of the field; e.g., using an asterisk in the 5th field (month) would indicate every month.
Slash ( / )
Slashes are used to describe increments of ranges. For example 3-59/15 in the 1st field (minutes) would indicate the 3rd minute of the hour and every 15 minutes thereafter. The form "*\/..." is equivalent to the form "first-last/...", that is, an increment over the largest possible range of the field. The form "N/..." is accepted as meaning "N-MAX/...", that is, starting at N, use the increment until the end of that specific range. It does not wrap around.
Comma ( , )
Commas are used to separate items of a list. For example, using "MON,WED,FRI" in the 5th field (day of week) would mean Mondays, Wednesdays and Fridays.
Hyphen ( - )
Hyphens are used to define ranges. For example, 9-17 would indicate every hour between 9am and 5pm inclusive.
Question mark ( ? )
Question mark may be used instead of '*' for leaving either day-of-month or day-of-week blank.
Predefined schedules ¶
You may use one of several pre-defined schedules in place of a cron expression.
Entry | Description | Equivalent To ----- | ----------- | ------------- @yearly (or @annually) | Run once a year, midnight, Jan. 1st | 0 0 0 1 1 * @monthly | Run once a month, midnight, first of month | 0 0 0 1 * * @weekly | Run once a week, midnight between Sat/Sun | 0 0 0 * * 0 @daily (or @midnight) | Run once a day, midnight | 0 0 0 * * * @hourly | Run once an hour, beginning of hour | 0 0 * * * *
Intervals ¶
You may also schedule a job to execute at fixed intervals, starting at the time it's added or cron is run. This is supported by formatting the cron spec like this:
@every <duration>
where "duration" is a string accepted by time.ParseDuration (http://golang.org/pkg/time/#ParseDuration).
For example, "@every 1h30m10s" would indicate a schedule that activates after 1 hour, 30 minutes, 10 seconds, and then every interval after that.
Note: The interval does not take the job runtime into account. For example, if a job takes 3 minutes to run, and it is scheduled to run every 5 minutes, it will have only 2 minutes of idle time between each run.
Time zones ¶
All interpretation and scheduling is done in the machine's local time zone (as provided by the Go time package (http://www.golang.org/pkg/time).
Be aware that jobs scheduled during daylight-savings leap-ahead transitions will not be run!
Thread safety ¶
Since the Cron service runs concurrently with the calling code, some amount of care must be taken to ensure proper synchronization.
All cron methods are designed to be correctly synchronized as long as the caller ensures that invocations have a clear happens-before ordering between them.
Implementation ¶
Cron entries are stored in an array, sorted by their next activation time. Cron sleeps until the next job is due to be run.
Upon waking:
- it runs each entry that is active on that second
- it calculates the next run times for the jobs that were run
- it re-sorts the array of entries by next activation time.
- it goes to sleep until the soonest job.
Index ¶
- Variables
- func Disabled(_ *Cron, entry *Entry)
- func HookDisable(hook *hookStruct)
- func HookSync(hook *hookStruct)
- func Label(label string) func(*Cron, *Entry)
- func RunOnStart(c *Cron, entry *Entry)
- func WithID(id EntryID) func(*Cron, *Entry)
- func WithNext(next time.Time) func(*Cron, *Entry)
- type Builder
- func (b *Builder) Build() *Cron
- func (b *Builder) Quiet() *Builder
- func (b *Builder) WithClock(clock clockwork.Clock) *Builder
- func (b *Builder) WithContext(ctx context.Context) *Builder
- func (b *Builder) WithIDFactory(idFactory IDFactory) *Builder
- func (b *Builder) WithJobRunLoggerFactory(jobRunLoggerFactory JobRunLoggerFactory) *Builder
- func (b *Builder) WithKeepCompletedRunsDur(keepCompletedRunsDur time.Duration) *Builder
- func (b *Builder) WithLocation(loc *time.Location) *Builder
- func (b *Builder) WithLogger(logger Logger) *Builder
- func (b *Builder) WithParser(parser ScheduleParser) *Builder
- func (b *Builder) WithSeconds() *Builder
- type ConstantDelaySchedule
- type Cron
- func (c *Cron) AddEntry(entry Entry, opts ...EntryOption) (EntryID, error)
- func (c *Cron) AddFunc(spec string, job FuncJob, opts ...EntryOption) (EntryID, error)
- func (c *Cron) AddJob(spec string, job IntoJob, opts ...EntryOption) (EntryID, error)
- func (c *Cron) AddJobStrict(spec string, job Job, opts ...EntryOption) (EntryID, error)
- func (c *Cron) CancelJobRun(entryID EntryID, runID RunID) error
- func (c *Cron) CleanupNow()
- func (c *Cron) CompletedJobRunsFor(entryID EntryID) ([]JobRun, error)
- func (c *Cron) CompletedJobs() []JobRun
- func (c *Cron) Disable(id EntryID)
- func (c *Cron) DisableHook(id HookID)
- func (c *Cron) Enable(id EntryID)
- func (c *Cron) EnableHook(id HookID)
- func (c *Cron) Entries() []Entry
- func (c *Cron) Entry(id EntryID) (Entry, error)
- func (c *Cron) GetCleanupTS() time.Time
- func (c *Cron) GetHook(id HookID) (Hook, error)
- func (c *Cron) GetHooks() []Hook
- func (c *Cron) GetJobRun(entryID EntryID, runID RunID) (JobRun, error)
- func (c *Cron) GetNextTime() time.Time
- func (c *Cron) IsRunning(id EntryID) bool
- func (c *Cron) JobRunCompletedCh() <-chan JobRun
- func (c *Cron) JobRunCreatedCh() <-chan JobRun
- func (c *Cron) Location() *time.Location
- func (c *Cron) OnEntryEvt(entryID EntryID, evt JobEventType, clb HookFn, opts ...HookOption) HookID
- func (c *Cron) OnEntryJobCompleted(entryID EntryID, clb HookFn, opts ...HookOption) HookID
- func (c *Cron) OnEntryJobStart(entryID EntryID, clb HookFn, opts ...HookOption) HookID
- func (c *Cron) OnEvt(evt JobEventType, clb HookFn, opts ...HookOption) HookID
- func (c *Cron) OnJobCompleted(clb HookFn, opts ...HookOption) HookID
- func (c *Cron) OnJobStart(clb HookFn, opts ...HookOption) HookID
- func (c *Cron) Remove(id EntryID)
- func (c *Cron) RemoveHook(id HookID)
- func (c *Cron) Run() (started bool)
- func (c *Cron) RunNow(id EntryID) error
- func (c *Cron) RunningJobs() []JobRun
- func (c *Cron) RunningJobsFor(entryID EntryID) ([]JobRun, error)
- func (c *Cron) Schedule(schedule Schedule, job Job, opts ...EntryOption) (EntryID, error)
- func (c *Cron) SetCleanupInterval(dur time.Duration)
- func (c *Cron) SetHookLabel(id HookID, label string)
- func (c *Cron) SetLocation(newLoc *time.Location)
- func (c *Cron) Start() (started bool)
- func (c *Cron) Stop() <-chan struct{}
- func (c *Cron) Sub(id EntryID) *pubsub.Sub[EntryID, JobEvent]
- func (c *Cron) UpdateLabel(id EntryID, label string)
- func (c *Cron) UpdateSchedule(id EntryID, schedule Schedule) error
- func (c *Cron) UpdateScheduleWithSpec(id EntryID, spec string) error
- func (c *Cron) Wait()
- type Entry
- type EntryID
- type EntryOption
- type FuncIDFactory
- type FuncJob
- type FuncJobRunLoggerFactory
- type Hook
- type HookFn
- type HookID
- type HookOption
- type ID
- type IDFactory
- type IntoJob
- type Job
- func Chain(j IntoJob, wrappers ...JobWrapper) Job
- func DelayIfStillRunning(j IntoJob) Job
- func J(v IntoJob) Job
- func N(n int, j IntoJob) Job
- func Once(job IntoJob) Job
- func SkipIfStillRunning(j IntoJob) Job
- func ThresholdClb(threshold time.Duration, j IntoJob, clb ThresholdCallback) Job
- func ThresholdClbAsync(threshold time.Duration, j IntoJob, clb ThresholdCallbackAsync) Job
- func WithDeadline(deadline time.Time, job IntoJob) Job
- func WithJitter(duration time.Duration, job IntoJob) Job
- func WithRetry(maxRetry int, job IntoJob) Job
- func WithTimeout(d time.Duration, job IntoJob) Job
- type Job1
- type Job10
- type Job10Wrapper
- type Job11
- type Job11Wrapper
- type Job12
- type Job12Wrapper
- type Job13
- type Job13Wrapper
- type Job14
- type Job14Wrapper
- type Job15
- type Job15Wrapper
- type Job16
- type Job16Wrapper
- type Job17
- type Job17Wrapper
- type Job18
- type Job18Wrapper
- type Job19
- type Job19Wrapper
- type Job1Wrapper
- type Job2
- type Job20
- type Job20Wrapper
- type Job21
- type Job21Wrapper
- type Job22
- type Job22Wrapper
- type Job23
- type Job23Wrapper
- type Job24
- type Job24Wrapper
- type Job25
- type Job25Wrapper
- type Job26
- type Job26Wrapper
- type Job27
- type Job27Wrapper
- type Job28
- type Job28Wrapper
- type Job29
- type Job29Wrapper
- type Job2Wrapper
- type Job3
- type Job30
- type Job30Wrapper
- type Job31
- type Job31Wrapper
- type Job3Wrapper
- type Job4
- type Job4Wrapper
- type Job5
- type Job5Wrapper
- type Job6
- type Job6Wrapper
- type Job7
- type Job7Wrapper
- type Job8
- type Job8Wrapper
- type Job9
- type Job9Wrapper
- type JobEvent
- type JobEventType
- type JobRun
- type JobRunLoggerFactory
- type JobWrapper
- func DeadlineWrapper(deadline time.Time) JobWrapper
- func JitterWrapper(duration time.Duration) JobWrapper
- func NWrapper(n int) JobWrapper
- func ThresholdClbAsyncWrapper(threshold time.Duration, clb ThresholdCallbackAsync) JobWrapper
- func ThresholdClbWrapper(threshold time.Duration, clb ThresholdCallback) JobWrapper
- func TimeoutWrapper(duration time.Duration) JobWrapper
- func WithRetryWrapper(maxRetry int) JobWrapper
- type Logger
- type ParseOption
- type Parser
- type RunID
- type Schedule
- type ScheduleParser
- type SpecSchedule
- type ThresholdCallback
- type ThresholdCallbackAsync
Constants ¶
This section is empty.
Variables ¶
var ErrEntryNotFound = errors.New("entry not found")
ErrEntryNotFound ...
var ErrHookNotFound = errors.New("hook not found")
ErrHookNotFound ...
var ErrIDAlreadyUsed = errors.New("id already used")
ErrIDAlreadyUsed ...
var ErrJobAlreadyRunning = errors.New("job already running")
ErrJobAlreadyRunning ...
var ErrJobRunNotFound = errors.New("job run not found")
ErrJobRunNotFound ...
var ErrUnsupportedJobType = errors.New("unsupported job type")
ErrUnsupportedJobType ...
var SecondParser = NewParser(Second | Minute | Hour | Dom | Month | DowOptional | Descriptor)
Functions ¶
func HookDisable ¶
func HookDisable(hook *hookStruct)
HookDisable disables a hook by setting its active status to false.
func RunOnStart ¶
Types ¶
type Builder ¶
type Builder struct {
// contains filtered or unexported fields
}
Builder provides a fluent interface for constructing a Cron instance with optional configuration. Use New() to create a builder, chain configuration methods, and call Build() to create the Cron instance.
func New ¶
func New() *Builder
New creates a new Builder instance for constructing a Cron scheduler.
func (*Builder) Build ¶
Build constructs and returns a configured Cron instance using the builder's settings. Default values are used for any unconfigured properties.
func (*Builder) WithContext ¶
WithContext sets the base context for the Cron instance.
func (*Builder) WithIDFactory ¶
WithIDFactory sets the ID generator factory for the Cron instance.
func (*Builder) WithJobRunLoggerFactory ¶
func (b *Builder) WithJobRunLoggerFactory(jobRunLoggerFactory JobRunLoggerFactory) *Builder
WithJobRunLoggerFactory sets the logger factory for individual job runs.
func (*Builder) WithKeepCompletedRunsDur ¶
WithKeepCompletedRunsDur sets the duration to keep completed job runs before cleanup.
func (*Builder) WithLocation ¶
WithLocation sets the timezone location for the Cron instance.
func (*Builder) WithLogger ¶
WithLogger sets the logger for the Cron instance.
func (*Builder) WithParser ¶
func (b *Builder) WithParser(parser ScheduleParser) *Builder
WithParser sets the schedule parser for the Cron instance.
func (*Builder) WithSeconds ¶
WithSeconds configures the parser to include seconds in the schedule specification.
type ConstantDelaySchedule ¶
ConstantDelaySchedule represents a simple recurring duty cycle, e.g. "Every 5 minutes". It does not support jobs more frequent than once a second.
func Every ¶
func Every(duration time.Duration) ConstantDelaySchedule
Every returns a crontab Schedule that activates once every duration. Delays of less than a second are not supported (will round up to 1 second). Any fields less than a Second are truncated.
type Cron ¶
type Cron struct {
// contains filtered or unexported fields
}
Cron keeps track of any number of entries, invoking the associated func as specified by the schedule. It may be started, stopped, and the entries may be inspected while running.
func (*Cron) AddEntry ¶
func (c *Cron) AddEntry(entry Entry, opts ...EntryOption) (EntryID, error)
AddEntry adds a pre-configured Entry to the Cron
func (*Cron) AddJobStrict ¶
AddJobStrict same as AddJob, but only accept a Job interface instead of IntoJob (any)
func (*Cron) CancelJobRun ¶
CancelJobRun attempts to cancel a running job by entry ID and run ID. Returns ErrEntryNotFound if the entry doesn't exist or ErrJobRunNotFound if the run doesn't exist.
func (*Cron) CleanupNow ¶
func (c *Cron) CleanupNow()
CleanupNow triggers immediate cleanup of completed job runs
func (*Cron) CompletedJobRunsFor ¶
CompletedJobRunsFor returns all completed job runs for a specific entry. Returns ErrEntryNotFound if the entry doesn't exist.
func (*Cron) CompletedJobs ¶
CompletedJobs returns a list of all completed job runs across all entries
func (*Cron) DisableHook ¶
DisableHook disables a previously enabled hook by its ID
func (*Cron) EnableHook ¶
EnableHook enables a previously disabled hook by its ID
func (*Cron) GetCleanupTS ¶
GetCleanupTS returns the timestamp of the last completed job runs cleanup
func (*Cron) GetJobRun ¶
GetJobRun retrieves a specific job run by entry ID and run ID. Returns ErrEntryNotFound if the entry doesn't exist or ErrJobRunNotFound if the run doesn't exist.
func (*Cron) GetNextTime ¶
GetNextTime returns the next time a job is scheduled to be executed If no job is scheduled to be executed, the Zero time is returned
func (*Cron) JobRunCompletedCh ¶
JobRunCompletedCh returns channel for job run completion notifications
func (*Cron) JobRunCreatedCh ¶
JobRunCreatedCh returns channel for job run creation notifications
func (*Cron) OnEntryEvt ¶
func (c *Cron) OnEntryEvt(entryID EntryID, evt JobEventType, clb HookFn, opts ...HookOption) HookID
OnEntryEvt registers a hook function for a specific job event type on a specific entry. The hook will be called only when the specified event occurs for the given entry. Returns the HookID for later removal.
func (*Cron) OnEntryJobCompleted ¶
func (c *Cron) OnEntryJobCompleted(entryID EntryID, clb HookFn, opts ...HookOption) HookID
OnEntryJobCompleted registers a hook function for job completion events on a specific entry. The hook will be called only when the given entry's job completes. Returns the HookID for later removal.
func (*Cron) OnEntryJobStart ¶
func (c *Cron) OnEntryJobStart(entryID EntryID, clb HookFn, opts ...HookOption) HookID
OnEntryJobStart registers a hook function for job start events on a specific entry. The hook will be called only when the given entry's job starts. Returns the HookID for later removal.
func (*Cron) OnEvt ¶
func (c *Cron) OnEvt(evt JobEventType, clb HookFn, opts ...HookOption) HookID
OnEvt registers a global hook function for a specific job event type. The hook will be called whenever the specified event occurs for any job. Returns the HookID for later removal.
func (*Cron) OnJobCompleted ¶
func (c *Cron) OnJobCompleted(clb HookFn, opts ...HookOption) HookID
OnJobCompleted registers a global hook function for job completion events. The hook will be called whenever any job completes. Returns the HookID for later removal.
func (*Cron) OnJobStart ¶
func (c *Cron) OnJobStart(clb HookFn, opts ...HookOption) HookID
OnJobStart registers a global hook function for job start events. The hook will be called whenever any job starts. Returns the HookID for later removal.
func (*Cron) RemoveHook ¶
RemoveHook removes a previously registered hook by its HookID. Works for both global and entry-specific hooks.
func (*Cron) RunningJobs ¶
RunningJobs returns a list of all currently running jobs across all entries
func (*Cron) RunningJobsFor ¶
RunningJobsFor returns all currently running jobs for a specific entry // Returns ErrEntryNotFound if the entry doesn't exist.
func (*Cron) SetCleanupInterval ¶
SetCleanupInterval sets the duration for keeping completed job runs before cleanup
func (*Cron) SetHookLabel ¶
SetHookLabel sets an hook's label
func (*Cron) SetLocation ¶
SetLocation sets a new location to use. Re-set the "Next" values for all entries. Re-sort entries and run due entries.
func (*Cron) Stop ¶
func (c *Cron) Stop() <-chan struct{}
Stop stops the cron scheduler if it is running; otherwise it does nothing. A context is returned so the caller can wait for running jobs to complete.
func (*Cron) UpdateLabel ¶
UpdateLabel updates an entry's label
func (*Cron) UpdateSchedule ¶
UpdateSchedule updates an entry's schedule with a new Schedule
func (*Cron) UpdateScheduleWithSpec ¶
UpdateScheduleWithSpec updates an entry's schedule by parsing a spec string
type Entry ¶
type Entry struct {
ID EntryID
Spec *string
// The schedule on which this job should be run.
Schedule Schedule
// The next time the job will run. This is the zero time if Cron has not been started or this entry's schedule is unsatisfiable
Next time.Time
// The last time this job was run. This is the zero time if the job has never been run.
Prev time.Time
// Label to describe the job
Label string
// Either or not the job is currently active
Active bool
// contains filtered or unexported fields
}
Entry consists of a schedule and the func to execute on that schedule.
type EntryOption ¶
type FuncIDFactory ¶
type FuncIDFactory func() ID
FuncIDFactory is a function type that generates a new unique ID. It implements the IDFactory interface by providing a Next() method.
func (FuncIDFactory) Next ¶
func (f FuncIDFactory) Next() ID
Next implements the IDFactory interface for FuncIDFactory. It calls the underlying function to generate and return a new ID.
type FuncJobRunLoggerFactory ¶
FuncJobRunLoggerFactory is a function type that implements JobRunLoggerFactory. It allows any function with the signature func(w io.Writer) *slog.Logger to be used as a JobRunLoggerFactory.
type Hook ¶
type Hook struct {
ID HookID // Unique identifier for the hook
EntryID *EntryID // Associated job entry ID (nil if global)
EventType JobEventType // Type of job event that triggers this hook
Active bool // Whether the hook is currently active
Async bool // Whether the hook runs asynchronously
Label string // Human-readable label for the hook
}
Hook represents a configured cron job hook with its properties.
type HookOption ¶
type HookOption func(*hookStruct)
HookOption is a function type for configuring a hook.
func HookLabel ¶
func HookLabel(label string) HookOption
HookLabel returns a HookOption that sets the label for a hook.
type IDFactory ¶
type IDFactory interface {
// Next generates and returns a new unique ID.
// Implementations must ensure IDs are unique across calls.
Next() ID
}
IDFactory is an interface for types that can generate unique IDs. Implementations should provide thread-safe ID generation.
type IntoJob ¶
type IntoJob any
IntoJob is something that can be cast into a Job. See the J helper documentation for all accepted function signatures.
type Job ¶
Job is an interface for submitted cron jobs.
func Chain ¶
func Chain(j IntoJob, wrappers ...JobWrapper) Job
Chain `Chain(j, w1, w2, w3)` -> `w3(w2(w1(j)))`
func DelayIfStillRunning ¶
DelayIfStillRunning serializes jobs, delaying subsequent runs until the previous one is complete. Jobs running after a delay of more than a minute have the delay logged at Info.
func J ¶
J is a helper to turn a IntoJob into a Job Any of these functions, or anything that have a "Run" method with one of these signatures can be casted into a Job. func() func() error func(context.Context) func(context.Context) error func(cron.EntryID) func(cron.EntryID) error func(cron.Entry) func(cron.Entry) error func(*cron.Cron) func(*cron.Cron) error func(cron.JobRun) func(cron.JobRun) error func(context.Context, cron.EntryID) func(context.Context, cron.EntryID) error func(context.Context, cron.Entry) func(context.Context, cron.Entry) error func(context.Context, *cron.Cron) func(context.Context, *cron.Cron) error func(context.Context, cron.JobRun) func(context.Context, cron.JobRun) error func(*cron.Cron, cron.EntryID) func(*cron.Cron, cron.EntryID) error func(*cron.Cron, cron.Entry) func(*cron.Cron, cron.Entry) error func(*cron.Cron, cron.JobRun) func(*cron.Cron, cron.JobRun) error func(context.Context, *cron.Cron, cron.EntryID) func(context.Context, *cron.Cron, cron.EntryID) error func(context.Context, *cron.Cron, cron.Entry) func(context.Context, *cron.Cron, cron.Entry) error func(context.Context, *cron.Cron, cron.JobRun) func(context.Context, *cron.Cron, cron.JobRun) error
func SkipIfStillRunning ¶
SkipIfStillRunning skips an invocation of the Job if a previous invocation is still running.
func ThresholdClb ¶
func ThresholdClb(threshold time.Duration, j IntoJob, clb ThresholdCallback) Job
ThresholdClb execute a callback if the job runs longer than the specified threshold.
func ThresholdClbAsync ¶
func ThresholdClbAsync(threshold time.Duration, j IntoJob, clb ThresholdCallbackAsync) Job
ThresholdClbAsync ...
func WithJitter ¶
WithJitter add some random delay before running the job
type Job10Wrapper ¶
type Job10Wrapper struct{ Job10 }
type Job11Wrapper ¶
type Job11Wrapper struct{ Job11 }
type Job12Wrapper ¶
type Job12Wrapper struct{ Job12 }
type Job13Wrapper ¶
type Job13Wrapper struct{ Job13 }
type Job14Wrapper ¶
type Job14Wrapper struct{ Job14 }
type Job15Wrapper ¶
type Job15Wrapper struct{ Job15 }
type Job16Wrapper ¶
type Job16Wrapper struct{ Job16 }
type Job17Wrapper ¶
type Job17Wrapper struct{ Job17 }
type Job18Wrapper ¶
type Job18Wrapper struct{ Job18 }
type Job19Wrapper ¶
type Job19Wrapper struct{ Job19 }
type Job1Wrapper ¶
type Job1Wrapper struct{ Job1 }
type Job20Wrapper ¶
type Job20Wrapper struct{ Job20 }
type Job21Wrapper ¶
type Job21Wrapper struct{ Job21 }
type Job22Wrapper ¶
type Job22Wrapper struct{ Job22 }
type Job23Wrapper ¶
type Job23Wrapper struct{ Job23 }
type Job24Wrapper ¶
type Job24Wrapper struct{ Job24 }
type Job25Wrapper ¶
type Job25Wrapper struct{ Job25 }
type Job26Wrapper ¶
type Job26Wrapper struct{ Job26 }
type Job27Wrapper ¶
type Job27Wrapper struct{ Job27 }
type Job28Wrapper ¶
type Job28Wrapper struct{ Job28 }
type Job29Wrapper ¶
type Job29Wrapper struct{ Job29 }
type Job2Wrapper ¶
type Job2Wrapper struct{ Job2 }
type Job30Wrapper ¶
type Job30Wrapper struct{ Job30 }
type Job31Wrapper ¶
type Job31Wrapper struct{ Job31 }
type Job3Wrapper ¶
type Job3Wrapper struct{ Job3 }
type Job4Wrapper ¶
type Job4Wrapper struct{ Job4 }
type Job5Wrapper ¶
type Job5Wrapper struct{ Job5 }
type Job6Wrapper ¶
type Job6Wrapper struct{ Job6 }
type Job7Wrapper ¶
type Job7Wrapper struct{ Job7 }
type Job8Wrapper ¶
type Job8Wrapper struct{ Job8 }
type Job9Wrapper ¶
type Job9Wrapper struct{ Job9 }
type JobEvent ¶
type JobEvent struct {
Typ JobEventType
CreatedAt time.Time
}
type JobEventType ¶
type JobEventType int
const ( JobStart JobEventType = iota + 1 JobCompleted JobErr JobPanic )
func (JobEventType) String ¶
func (e JobEventType) String() string
type JobRun ¶
type JobRun struct {
RunID RunID // Unique identifier for this job run
Entry Entry // Job definition being executed
CreatedAt time.Time // When the run was created
StartedAt *time.Time // When execution began (nil if not started)
CompletedAt *time.Time // When execution finished (nil if not completed)
Events []JobEvent // Timeline of events during execution
Error error // Final error state if any
Panic bool // Whether job panicked during execution
Logs string // Captured log output
// contains filtered or unexported fields
}
JobRun represents a single execution of a scheduled job.
type JobRunLoggerFactory ¶
type JobRunLoggerFactory interface {
// New creates a new slog.Logger instance that writes to the given io.Writer.
New(w io.Writer) Logger
}
JobRunLoggerFactory is an interface for creating loggers for individual job runs. Implementations should create a new logger that writes to the provided io.Writer.
func DefaultJobRunLoggerFactory ¶
func DefaultJobRunLoggerFactory() JobRunLoggerFactory
DefaultJobRunLoggerFactory returns a default implementation of JobRunLoggerFactory. The default implementation creates a text-based logger with debug level logging that writes to the provided io.Writer.
type JobWrapper ¶
func DeadlineWrapper ¶
func DeadlineWrapper(deadline time.Time) JobWrapper
func JitterWrapper ¶
func JitterWrapper(duration time.Duration) JobWrapper
JitterWrapper add some random delay before running the job
func NWrapper ¶
func NWrapper(n int) JobWrapper
func ThresholdClbAsyncWrapper ¶
func ThresholdClbAsyncWrapper(threshold time.Duration, clb ThresholdCallbackAsync) JobWrapper
ThresholdClbAsyncWrapper wraps a job and starts a timer for the given threshold. If the job runs longer than the threshold, the callback is triggered. The callback is invoked asynchronously and does not block job execution.
func ThresholdClbWrapper ¶
func ThresholdClbWrapper(threshold time.Duration, clb ThresholdCallback) JobWrapper
func TimeoutWrapper ¶
func TimeoutWrapper(duration time.Duration) JobWrapper
TimeoutWrapper automatically cancel the job context after a given duration
func WithRetryWrapper ¶
func WithRetryWrapper(maxRetry int) JobWrapper
WithRetryWrapper creates a JobWrapper that retries a job up to maxRetry times
type Logger ¶
type Logger interface {
// Debug logs a debug message with optional key-value pairs
Debug(msg string, keysAndValues ...any)
// Info logs an informational message with optional key-value pairs
Info(msg string, keysAndValues ...any)
// Warn logs a warning message with optional key-value pairs
Warn(msg string, keysAndValues ...any)
// Error logs an error message with optional key-value pairs
Error(msg string, keysAndValues ...any)
}
Logger is the interface used in this package for logging, so that any backend can be plugged in.
type ParseOption ¶
type ParseOption int
Configuration options for creating a parser. Most options specify which fields should be included, while others enable features. If a field is not included the parser will assume a default value. These options do not change the order fields are parse in.
const ( Second ParseOption = 1 << iota // Seconds field, default 0 SecondOptional // Optional seconds field, default 0 Minute // Minutes field, default 0 Hour // Hours field, default 0 Dom // Day of month field, default * Month // Month field, default * Dow // Day of week field, default * DowOptional // Optional day of week field, default * Descriptor // Allow descriptors such as @monthly, @weekly, etc. )
type Parser ¶
type Parser struct {
// contains filtered or unexported fields
}
A custom Parser that can be configured.
func NewParser ¶
func NewParser(options ParseOption) Parser
NewParser creates a Parser with custom options.
It panics if more than one Optional is given, since it would be impossible to correctly infer which optional is provided or missing in general.
Examples
// Standard parser without descriptors
specParser := NewParser(Minute | Hour | Dom | Month | Dow)
sched, err := specParser.Parse("0 0 15 */3 *")
// Same as above, just excludes time fields
specParser := NewParser(Dom | Month | Dow)
sched, err := specParser.Parse("15 */3 *")
// Same as above, just makes Dow optional
specParser := NewParser(Dom | Month | DowOptional)
sched, err := specParser.Parse("15 */3")
type Schedule ¶
type Schedule interface {
// Next return the next activation time, later than the given time.
// Next is invoked initially, and then each time the job is run.
Next(time.Time) time.Time
}
The Schedule describes a job's duty cycle.
func ParseStandard ¶
ParseStandard returns a new crontab schedule representing the given standardSpec (https://en.wikipedia.org/wiki/Cron). It requires 5 entries representing: minute, hour, day of month, month and day of week, in that order. It returns a descriptive error if the spec is not valid.
It accepts
- Standard crontab specs, e.g. "* * * * ?"
- Descriptors, e.g. "@midnight", "@every 1h30m"
type ScheduleParser ¶
ScheduleParser is an interface for schedule spec parsers that return a Schedule
type SpecSchedule ¶
type SpecSchedule struct {
Second, Minute, Hour, Dom, Month, Dow uint64
// Override location for this schedule.
Location *time.Location
}
SpecSchedule specifies a duty cycle (to the second granularity), based on a traditional crontab specification. It is computed initially and stored as bit sets.