cronx

package
v0.1.2 Latest Latest
Warning

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

Go to latest
Published: Nov 4, 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