在实际项目开发中Web应用有一类不可缺少的,那就是定时任务。 定时任务的场景可以说非常广泛,比如某些视频网站,购买会员后,每天会给会员送成长值,每月会给会员送一些电影券; 比如在保证最终一致性的场景中,往往利用定时任务调度进行一些比对工作;比如一些定时需要生成的报表、邮件;比如一些需要定时清理数据的任务等。 所以我们提供方便友好的web界面,实现动态管理任务,可以达到动态控制定时任务启动、暂停、重启、删除、添加、修改等操作,极大地方便了开发过程。
(捐赠版、授权版才有此功能)
gfast 采用的是gf的gcron模块提供了对定时任务的实现,支持类似crontab的配置管理方式,并支持最小粒度到秒的定时任务管理。
具体实现请参阅gf文档:https://goframe.org/pages/viewpage.action?pageId=1114187
使用方式
- 后台添加定时任务处理的方法
定时任务方法绑定在./task/bind_function.go
文件。
//定义一个无参测试任务 打印一个测试字符串
func Test1(ctx context.Context) {
fmt.Println("无参测试")
service.SysJobLog().Add(ctx, &do.SysJobLog{
TargetName: "test1",
CreatedAt: gtime.Now(),
Result: "无参测试运行成功",
})
}
func Test2(ctx context.Context) {
//获取参数
t := service.TaskList().GetByName("test2")
if t == nil {
return
}
for _, v := range t.Param {
fmt.Printf("参数:%s; ", v)
}
fmt.Println()
service.SysJobLog().Add(ctx, &do.SysJobLog{
TargetName: "test2",
CreatedAt: gtime.Now(),
Result: "有参测试运行成功",
})
}
- 在初始化的时候绑定该方法
func init() {
task1 := &model.TimeTask{
FuncName: "test1",
Run: Test1,
}
task2 := &model.TimeTask{
FuncName: "test2",
Run: Test2,
}
checkUserOnlineTask := &model.TimeTask{
FuncName: "checkUserOnline",
Run: service.SysUserOnline().CheckUserOnline,
}
service.TaskList().AddTask(task1)
service.TaskList().AddTask(task2)
service.TaskList().AddTask(checkUserOnlineTask)
ctx := gctx.New()
//自动执行已开启的任务
jobs, err := service.SysJob().GetJobs(ctx)
if err != nil {
g.Log().Error(ctx, err)
return
}
for _, job := range jobs {
service.SysJob().JobStart(ctx, job)
}
}
- 后台添加任务
- 开启执行任务
每隔一秒钟可以看到控制台输出任务所打印的字符串:
注意:此处用于测试所有把测试方法直接写在了demo.go文件中,正式使用的时候为了不让此文件过于混乱,可以把要执行的方法定义到其他文件或包下,直接绑定使用,参看在线用户更新任务。
作者:管理员 创建时间:2023-01-06 16:55
最后编辑:管理员 更新时间:2024-12-03 15:05
最后编辑:管理员 更新时间:2024-12-03 15:05