cron

package
v1.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 4, 2026 License: MIT Imports: 9 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Start

func Start()

Start 启动全局调度器

func Stop

func Stop()

Stop 停止全局调度器(无限等待,见 Scheduler.Stop)。

func StopGlobalWithTimeout added in v1.2.0

func StopGlobalWithTimeout(timeout time.Duration) bool

StopGlobalWithTimeout 停止全局调度器并最多等待 timeout(P1 #10)。 全局调度器尚未创建时无操作返回 true,不会因此惰性创建它——供 App.Shutdown 安全调用。

Types

type CronSchedule

type CronSchedule struct {
	Minute string // 分钟: "*" 或具体值如 "0,15,30"
	Hour   string // 小时: "*" 或具体值如 "8,12"
}

CronSchedule 简化 Cron 调度(仅分钟和小时)

func Cron

func Cron(minute, hour string) *CronSchedule

Cron 创建类 Cron 调度

func (*CronSchedule) Next

func (s *CronSchedule) Next(now time.Time) time.Time

Next 计算下次运行时间

type DailySchedule

type DailySchedule struct {
	Hour   int
	Minute int
}

DailySchedule 每日定时调度

func Daily

func Daily(hour, minute int) *DailySchedule

Daily 每日指定时间运行

func (*DailySchedule) Next

func (s *DailySchedule) Next(now time.Time) time.Time

Next 计算下次运行时间

type FullCronSchedule

type FullCronSchedule struct {
	Minute  string // 分钟: 0-59, "*", "*/n", "a-b", "a,b,c"
	Hour    string // 小时: 0-23, "*", "*/n", "a-b", "a,b,c"
	Day     string // 日: 1-31, "*", "*/n", "a-b", "a,b,c"
	Month   string // 月: 1-12, "*", "*/n", "a-b", "a,b,c"
	Weekday string // 星期: 0-6 (周日=0), "*", "*/n", "a-b", "a,b,c"
}

FullCronSchedule 完整 Cron 表达式调度 格式: "分钟 小时 日 月 星期" (5字段) 示例: "0 12 * * *" 每天12点

"0 0 1 * *" 每月1号凌晨
"0 9-17 * * 1-5" 周一到周五 9点到17点每小时

func ParseCron

func ParseCron(expr string) *FullCronSchedule

ParseCron 解析完整 Cron 表达式。 格式: "分钟 小时 日 月 星期" 示例:

"0 12 * * *"       - 每天12:00
"*/15 * * * *"     - 每15分钟
"0 9-17 * * 1-5"   - 工作日9-17点每小时
"0 0 1 * *"        - 每月1号凌晨
"0 0 * * 0"        - 每周日凌晨

非法表达式回退默认全 "*"(每分钟执行)。需要严格校验请用 ParseCronStrict。

func ParseCronStrict added in v1.2.0

func ParseCronStrict(expr string) (*FullCronSchedule, error)

ParseCronStrict 严格解析 Cron 表达式,校验字段数与各字段范围,非法返 error。 字段范围:分钟 0-59,小时 0-23,日 1-31,月 1-12,星期 0-6(周日=0,7 归一为 0)。

func (*FullCronSchedule) Next

func (s *FullCronSchedule) Next(now time.Time) time.Time

Next 计算下次运行时间

type IntervalSchedule

type IntervalSchedule struct {
	Interval time.Duration
}

IntervalSchedule 固定间隔调度

func Every

func Every(interval time.Duration) *IntervalSchedule

Every 每隔指定时间运行

func (*IntervalSchedule) Next

func (s *IntervalSchedule) Next(now time.Time) time.Time

Next 计算下次运行时间

type Schedule

type Schedule interface {
	Next(now time.Time) time.Time
}

Schedule 调度接口

type Scheduler

type Scheduler struct {
	// contains filtered or unexported fields
}

Scheduler 调度器

func GetScheduler

func GetScheduler() *Scheduler

GetScheduler 获取全局调度器(懒初始化,并发安全)。

func NewScheduler

func NewScheduler() *Scheduler

NewScheduler 创建调度器

func (*Scheduler) AddTask

func (s *Scheduler) AddTask(name string, schedule Schedule, handler TaskHandler) *Task

AddTask 添加任务

func (*Scheduler) DisableTask

func (s *Scheduler) DisableTask(name string) error

DisableTask 禁用任务

func (*Scheduler) EnableTask

func (s *Scheduler) EnableTask(name string) error

EnableTask 启用任务

func (*Scheduler) GetTask

func (s *Scheduler) GetTask(name string) (*Task, error)

GetTask 获取任务(返回拷贝快照,避免外部并发读 live 指针,C12a)。

func (*Scheduler) ListTasks

func (s *Scheduler) ListTasks() []*Task

ListTasks 获取所有任务(返回拷贝快照,C12a)。

func (*Scheduler) RemoveTask

func (s *Scheduler) RemoveTask(name string)

RemoveTask 移除任务

func (*Scheduler) RunTask

func (s *Scheduler) RunTask(name string) error

RunTask 立即运行任务(手动触发,同步返回 handler 错误)。

占用 per-task running 守卫,与调度循环互斥,防止同一任务重叠执行(C12b)。 不推进 NextRun(手动触发不影响调度节奏,C12c)。LastRun/RunCount 在锁内更新(C12a)。

L-J:handler 收到的 ctx 为调度器 s.ctx。Stop 后 s.ctx 已取消,handler 会收到 canceled ctx——这是预期行为(手动触发在调度器停止后不应继续执行长任务)。调用方若需在 Stop 后 仍运行一次性任务,应在自己的 ctx 下执行而非依赖调度器。

func (*Scheduler) Start

func (s *Scheduler) Start()

Start 启动调度器

func (*Scheduler) Stop

func (s *Scheduler) Stop()

Stop 停止调度器并无限等待在跑任务退出(要求 handler 尊重 ctx.Done)。 若担心某 handler 不响应 ctx 而永久阻塞,请用 StopWithTimeout。

func (*Scheduler) StopWithTimeout added in v1.2.0

func (s *Scheduler) StopWithTimeout(timeout time.Duration) bool

StopWithTimeout 停止调度器,最多等待 timeout 让在跑任务退出(P1 #10)。 返回 true 表示所有任务已退出;false 表示超时(仍有任务未响应 ctx.Done 而运行)。 timeout<=0 等价于无限等待(同 Stop)。幂等:未运行时直接返回 true。

type Task

type Task struct {
	Name      string      // 任务名称
	Schedule  Schedule    // 调度规则
	Handler   TaskHandler // 任务处理函数
	Enabled   bool        // 是否启用
	LastRun   time.Time   // 上次运行时间
	NextRun   time.Time   // 下次运行时间
	RunCount  int         // 运行次数
	LastError error       // CR3 修复:最近一次执行错误
	// contains filtered or unexported fields
}

Task 定时任务

func AddTask

func AddTask(name string, schedule Schedule, handler TaskHandler) *Task

AddTask 添加任务到全局调度器

type TaskHandler

type TaskHandler func(ctx context.Context) error

TaskHandler 任务处理函数

type WeeklySchedule

type WeeklySchedule struct {
	Day    time.Weekday
	Hour   int
	Minute int
}

WeeklySchedule 每周定时调度

func Weekly

func Weekly(day time.Weekday, hour, minute int) *WeeklySchedule

Weekly 每周指定时间运行

func (*WeeklySchedule) Next

func (s *WeeklySchedule) Next(now time.Time) time.Time

Next 计算下次运行时间。

C12d:原实现 `daysUntil <= 0 → +7` 仅按 weekday 差值,不比较当天时刻, 当天目标时刻未到(如周一 9:00 目标、当前周一 12:00 之前的 8:00)被错误跳一周。 改为:先算今天的目标时刻,按 `((day-now)+7)%7` 加天数,再与 now 比较—— 当天未到点则本周,当天已过则下周。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL