Skip to content

定时任务

Zoox 集成了 Cron 任务调度功能,可以轻松创建定时执行的任务。

基本用法

创建定时任务

go
package main

import (
	"github.com/go-zoox/zoox"
)

func main() {
	app := zoox.New()
	
	// 获取 Cron 实例
	cron := app.Cron()
	
	// 添加定时任务
	cron.AddJob("daily-cleanup", "0 0 * * *", func() error {
		// 每天午夜执行
		app.Logger().Info("Running daily cleanup")
		return nil
	})
	
	app.Run(":8080")
}

说明: Cron 实现参考 application.go:448-455

Cron 表达式

Zoox 使用标准的 Cron 表达式格式:

秒 分 时 日 月 星期
*  *  *  *  *  *

常用表达式

go
// 每分钟执行
cron.AddJob("every-minute", "* * * * *", handler)

// 每小时执行
cron.AddJob("every-hour", "0 * * * *", handler)

// 每天午夜执行
cron.AddJob("daily", "0 0 * * *", handler)

// 每周一执行
cron.AddJob("weekly", "0 0 * * 1", handler)

// 每月1号执行
cron.AddJob("monthly", "0 0 1 * *", handler)

// 每5分钟执行
cron.AddJob("every-5-minutes", "*/5 * * * *", handler)

// 工作日上午9点执行
cron.AddJob("workday-9am", "0 9 * * 1-5", handler)

任务处理

基本任务

go
cron.AddJob("simple-task", "0 * * * *", func() error {
	app.Logger().Info("Task executed")
	return nil
})

带错误处理的任务

go
cron.AddJob("task-with-error", "0 * * * *", func() error {
	// 执行任务
	if err := doSomething(); err != nil {
		app.Logger().Errorf("Task failed: %v", err)
		return err
	}
	return nil
})

长时间运行的任务

go
cron.AddJob("long-task", "0 0 * * *", func() error {
	// 使用 goroutine 处理长时间任务
	go func() {
		// 长时间运行的任务
		processLargeData()
	}()
	return nil
})

在 Context 中使用

在请求处理中使用 Cron:

go
app.Get("/trigger", func(ctx *zoox.Context) {
	cron := ctx.Cron()
	
	// 添加一次性任务
	cron.AddJob("one-time", "* * * * *", func() error {
		ctx.Logger().Info("One-time task executed")
		return nil
	})
	
	ctx.JSON(200, zoox.H{"message": "Task scheduled"})
})

说明: Context 中的 Cron 参考 context.go:937-944

完整示例

go
package main

import (
	"time"
	
	"github.com/go-zoox/zoox"
)

func main() {
	app := zoox.New()
	
	cron := app.Cron()
	
	// 每分钟执行的任务
	cron.AddJob("heartbeat", "* * * * *", func() error {
		app.Logger().Info("Heartbeat: " + time.Now().String())
		return nil
	})
	
	// 每小时执行的数据清理
	cron.AddJob("hourly-cleanup", "0 * * * *", func() error {
		app.Logger().Info("Running hourly cleanup")
		// 清理逻辑
		return nil
	})
	
	// 每天午夜执行的备份
	cron.AddJob("daily-backup", "0 0 * * *", func() error {
		app.Logger().Info("Running daily backup")
		// 备份逻辑
		return nil
	})
	
	// 每周一执行的报告生成
	cron.AddJob("weekly-report", "0 0 * * 1", func() error {
		app.Logger().Info("Generating weekly report")
		// 报告生成逻辑
		return nil
	})
	
	app.Run(":8080")
}

任务管理

获取所有任务

go
jobs := cron.GetJobs()
for name, job := range jobs {
	app.Logger().Infof("Job: %s, Schedule: %s", name, job.Schedule())
}

删除任务

go
cron.RemoveJob("task-name")

暂停/恢复任务

go
// 暂停任务
cron.PauseJob("task-name")

// 恢复任务
cron.ResumeJob("task-name")

最佳实践

1. 错误处理

go
cron.AddJob("task", "0 * * * *", func() error {
	if err := doTask(); err != nil {
		// 记录错误但继续执行
		app.Logger().Errorf("Task error: %v", err)
		// 可以选择返回错误停止任务,或返回 nil 继续
		return nil
	}
	return nil
})

2. 任务超时

go
cron.AddJob("task", "0 * * * *", func() error {
	done := make(chan error, 1)
	
	go func() {
		done <- doLongTask()
	}()
	
	select {
	case err := <-done:
		return err
	case <-time.After(5 * time.Minute):
		return errors.New("task timeout")
	}
})

3. 任务互斥

go
var taskMutex sync.Mutex

cron.AddJob("task", "0 * * * *", func() error {
	taskMutex.Lock()
	defer taskMutex.Unlock()
	
	// 确保同一时间只有一个任务实例运行
	return doTask()
})

4. 任务日志

go
cron.AddJob("task", "0 * * * *", func() error {
	start := time.Now()
	app.Logger().Info("Task started")
	
	err := doTask()
	
	duration := time.Since(start)
	if err != nil {
		app.Logger().Errorf("Task failed after %v: %v", duration, err)
	} else {
		app.Logger().Infof("Task completed in %v", duration)
	}
	
	return err
})

与 JobQueue 结合

可以将 Cron 任务与 JobQueue 结合使用:

go
cron.AddJob("schedule-jobs", "0 * * * *", func() error {
	queue := app.JobQueue()
	
	// 将任务添加到队列
	queue.Add("process-data", map[string]interface{}{
		"timestamp": time.Now(),
	})
	
	return nil
})

下一步


需要更多帮助? 👉 完整文档索引

Released under the MIT License.