Help us shape the future of Go! Take the 2026 Go Developer Survey

cronx

package
v0.1.0 Latest Latest
Warning

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

Go to latest
Published: Nov 3, 2026 License: Apache-2.0 Imports: 11 Imported by: 0

Documentation

Overview

Package cronx 组合 gocron v2 与 logit,提供实例式 Cron、固定和随机间隔调度。 不读取配置文件、不持有全局调度器,不依赖 HTTP 或其他公开 infra 包。

HandlerRegistry 维护应用持有的具名函数清单,登记不读配置或启动调度:

func Heartbeat(context.Context) error {
	return nil
}

var Registry = cronx.MustNewHandlerRegistry(Heartbeat)

注册表零值可用;MustRegister(handler, name) 支持显式稳定名称。 包级具名函数默认保留原始大小写;方法值、闭包、泛型函数必须显式命名。 nil、非法名称、多个名称参数及重名均以带 cronx: 前缀的 error 值 panic; 登记失败不改变清单。Handlers 按登记顺序返回 []NamedHandler 独立副本, 可交给 bootstrap.NewCronService 或自行绑定调度。 登记与快照读取可并发,首次使用后不得复制;后续登记不影响已构造的调度器。

独立构造并运行(需导入 context、errors、time 及本包):

scheduler, err := cronx.New(cronx.Config{}, cronx.Job{
	Name:    "heartbeat",
	Every:   time.Second,
	Timeout: 2 * time.Second,
	Handler: func(ctx context.Context) error {
		return ctx.Err()
	},
})
if err != nil {
	return err
}
runDone := make(chan error, 1)
go func() { runDone <- scheduler.Run() }()
time.Sleep(3 * time.Second)
stopErr := scheduler.Stop()
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
waitErr := scheduler.Wait(ctx)
if waitErr != nil {
	scheduler.Cancel()
	return errors.Join(stopErr, waitErr)
}
return errors.Join(stopErr, <-runDone)

Job 的 Cron、Every、RandomEvery 恰好选一个;Cron 为秒起始的六字段,不接受 内嵌时区或描述符。Location 默认 Asia/Shanghai,通过 time.LoadLocation 加载, 加载失败则返回构造错误;显式指定时区时保留原始对象,支持匿名或自定义名称的固定时区。 固定间隔 Every 和随机间隔 RandomEvery.Min 最短均为 100ms,小于下限时构造报错。 固定及随机间隔首次等待,不立即执行。 随机间隔为 [Min, Max),不会按本轮完成时间重新起算;重叠触发跳过、不排队。 各任务独立并行,每轮有独立日志字段、耗时作用域和 logId。Handler 返回错误或 panic 不终止 Scheduler。Timeout 只取消 context,实际返回后才释放执行位置。 执行结果通过日志观察,不提供状态统计接口;重叠跳过不单独输出日志。 Handler 必须等待其子工作完成,不得使用 runtime.Goexit 或同步等待自身关闭。

Config.Locker 可直接接收 gocron.Locker;所有任务共享该锁策略,并须设置正 Timeout。 gocron-redis-lock 的连接、前缀、TTL 与续租由应用或 biz/bootstrap 配置,不扩展 lockx。 获取锁失败跳过本轮;解锁使用独立 1s context 并记录错误,等实际业务返回后才释放。 租约有效时提供同名任务互斥,不保证每个时间点集群只执行一次;各节点独立调度。 Redis 插件失租不会通知或取消 Handler,关键业务仍须幂等和数据端约束。

New 不执行业务,但会创建引擎 goroutine,构造后须 Stop 并 Wait(ctx)。 Run 阻塞到停收,Stop 封闭新任务和获锁入口;Wait 等待任务、锁操作及日志实际结束。 业务 context 独立于引擎关闭通知,仅业务自身期限或显式 Cancel 才取消尚在排空的任务。 Cancel 先停收再协作取消剩余任务,也可直接调用;随后仍可通过 Wait 确认实际收尾。 组件没有独立排空计时,托管运行与其他服务共享 apprun 默认 30 秒期限。 超时后调用 Cancel,入口继续回收共享资源,资源栈默认整体 20 秒,日志最后关闭。 取消不能强杀业务,也不提前解锁。构造方式与当前 API 示例见上文;文件装配由 biz/bootstrap 提供。

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrStarted = errors.New("cronx: scheduler already started")
	ErrClosed  = errors.New("cronx: scheduler closed")
)

Functions

This section is empty.

Types

type Config

type Config struct {
	// Location 为 nil 时加载 Asia/Shanghai,失败则返回构造错误;非 nil 时保留对象的完整规则。
	Location   *time.Location
	LoggerName string
	Locker     gocron.Locker
}

Config 只包含运行配置;文件解析、环境与 Redis 客户端由调用方组合。

type Handler

type Handler func(context.Context) error

Handler 必须在返回前等待本轮全部工作与清理结束,取消只作为协作停止信号。

type HandlerRegistry

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

HandlerRegistry 收集由应用持有的任务声明,不读配置或执行业务;零值可用。 MustRegister 与 Handlers 可并发调用,首次使用后不得复制注册器。

func MustNewHandlerRegistry

func MustNewHandlerRegistry(handlers ...Handler) *HandlerRegistry

MustNewHandlerRegistry 批量登记包级具名函数,默认名称为原始函数名,区分大小写。 非法 Handler 或名称冲突会 panic;闭包、方法值和泛型函数须改用 MustRegister 显式命名。

func (*HandlerRegistry) Handlers

func (r *HandlerRegistry) Handlers() []NamedHandler

Handlers 按登记顺序返回独立清单;后续登记不改变已交付的清单或已构造的调度器。

func (*HandlerRegistry) MustRegister

func (r *HandlerRegistry) MustRegister(handler Handler, name ...string)

MustRegister 追加任务声明;可选 name 最多一个,提供时按原值作为稳定名称。 未提供名称时,只为包级具名函数自动取名并保留大小写;名称为空、含首尾空白、重复或 Handler 为 nil 均 panic。 非法登记统一以带 cronx: 前缀的 error 值 panic,并保留底层错误链。 自动名称会随函数重命名改变;YAML 绑定和锁标识需要兼容时,应显式固定名称。

type Job

type Job struct {
	Name         string
	Cron         string
	Every        time.Duration
	RandomEvery  *RandomInterval
	Timeout      time.Duration
	SuccessLevel logit.Level
	Handler      Handler
}

Job 定义稳定的任务名与一种调度方式;Timeout 从进入 Handler 开始计时。 固定间隔 Every 至少为 100ms,RandomEvery 的下限遵循 RandomInterval。

type NamedHandler

type NamedHandler struct {
	Name    string
	Handler Handler
}

NamedHandler 将业务函数绑定到稳定名称,不包含调度或配置文件信息。

type RandomInterval

type RandomInterval struct {
	Min time.Duration
	Max time.Duration
}

RandomInterval 表示每轮重新抽取的 [Min, Max) 间隔,要求 100ms <= Min < Max。

type Scheduler

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

Scheduler 由 New 创建,使用后不可复制;一个实例只运行一次。

func New

func New(cfg Config, jobs ...Job) (*Scheduler, error)

New 校验并复制全部任务,不执行业务;引擎构造会创建内部 goroutine。

func (*Scheduler) Cancel

func (s *Scheduler) Cancel()

Cancel 先停收,再协作取消剩余业务;任务实际返回前仍不释放执行位置或锁。

func (*Scheduler) Run

func (s *Scheduler) Run() error

Run 启动调度并阻塞到停收;实际任务结束由 Wait 确认。

func (*Scheduler) Stop

func (s *Scheduler) Stop() error

Stop 立即封闭任务与获锁入口,并异步停止引擎;不取消业务 context。

func (*Scheduler) Wait

func (s *Scheduler) Wait(ctx context.Context) error

Wait 等待引擎、业务、锁及日志实际收尾;ctx 到期不代替业务完成,也不自动取消业务。

Jump to

Keyboard shortcuts

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