cron 每小时_Go Web 框架 Gin 实践11—Cron定时任务

Go语言中文网,致力于每日分享编码知识,欢迎关注我,每天一起进步!

b07db601555c54c9ce78c1e1a053e5e9.png

Cron定时任务

项目地址:https://github.com/EDDYCJY/go...

如果对你有所帮助,欢迎点个 Star 或赞

在实际的应用项目中,定时任务的使用是很常见的。你是否有过 Golang 如何做定时任务的疑问,莫非是轮询?

在本文中我们将结合我们的项目讲述 Cron

介绍

我们将使用 cron 这个包,它实现了 cron 规范解析器和任务运行器,简单来讲就是包含了定时任务所需的功能

Cron 表达式格式

f8808f39b529d7f72f7f67aafeea0057.png

Cron表达式表示一组时间,使用 6 个空格分隔的字段

可以留意到 Golang 的 Cron 比 Crontab 多了一个秒级,以后遇到秒级要求的时候就省事了

Cron 特殊字符

1、星号 ( * )

星号表示将匹配字段的所有值

2、斜线 ( / )

斜线用户 描述范围的增量,表现为 “N-MAX/x”,first-last/x 的形式,例如 3-59/15 表示此时的第三分钟和此后的每 15 分钟,到59分钟为止。即从 N 开始,使用增量直到该特定范围结束。它不会重复

3、逗号 ( , )

逗号用于分隔列表中的项目。例如,在 Day of week 使用“MON,WED,FRI”将意味着星期一,星期三和星期五

4、连字符 ( - )

连字符用于定义范围。例如,9 - 17 表示从上午 9 点到下午 5 点的每个小时

5、问号 ( ? )

不指定值,用于代替 “ * ”,类似 “ _ ” 的存在,不难理解

预定义的 Cron 时间表

b0f5ebb023e7a20dd33195743b5cf062.png

安装

$ go get -u github.com/robfig/cron

实践

在上一章节 Go Web 框架 Gin 实践10—定制 GORM Callbacks 中,我们使用了 GORM 的回调实现了软删除,同时也引入了另外一个问题

就是我怎么硬删除,我什么时候硬删除?这个往往与业务场景有关系,大致为

  • 另外有一套硬删除接口
  • 定时任务清理(或转移、backup)无效数据

在这里我们选用第二种解决方案来进行实践

编写硬删除代码

560481080280fc911c759c735b63ade7.png

打开 models 目录下的 tag.go、article.go文件,分别添加以下代码

1、tag.go

af8c613b81a37c04cb39dbc2e7347c06.png

2、article.go

f42942eebd11af0449d0de58ba265d05.png

注意硬删除要使用 Unscoped(),这是 GORM 的约定

编写Cron

在 项目根目录下新建 cron.go 文件,用于编写定时任务的代码,写入文件内容

36cf43be5810579e26e6c6ea7d3c7123.png
3a8e90ff2b958acaed5c76383de924c5.png

在这段程序中,我们做了如下的事情

1、cron.New()

会根据本地时间创建一个新(空白)的 Cron job runner

f1688a67f4b3123a78c71983f8a20b1d.png

2、c.AddFunc()

AddFunc 会向 Cron job runner 添加一个 func ,以按给定的时间表运行

e744d93ccb7cc4e15e9f1a4b7f4a7927.png

会首先解析时间表,如果填写有问题会直接 err,无误则将 func 添加到 Schedule 队列中等待执行

667e7c8cb39f7a8838dd3445066f7351.png

3、c.Start()

在当前执行的程序中启动 Cron 调度程序。其实这里的主体是 goroutine + for + select + timer 的调度控制哦

8b66863641917ebf722a6026e5ce9440.png

4、time.NewTimer + for + select + t1.Reset

如果你是初学者,大概会有疑问,这是干嘛用的?

(1)time.NewTimer

会创建一个新的定时器,持续你设定的时间 d 后发送一个 channel 消息

(2)for + select

阻塞 select 等待 channel

(3)t1.Reset

会重置定时器,让它重新开始计时

(注意,本文适用于 “t.C已经取走,可直接使用 Reset”)


总的来说,这段程序是为了阻塞主程序而编写的,希望你带着疑问来想,有没有别的办法呢?

有的,你直接 select{} 也可以完成这个需求 :)

验证

317ff681f8ecbd235515303e63c3120a.png

检查输出日志正常,模拟已软删除的数据,定时任务工作OK

小结

定时任务很常见,希望你通过本文能够熟知 Golang 怎么实现一个简单的定时任务调度管理

可以不依赖系统的 Crontab 设置,指不定哪一天就用上了呢

参考

本系列示例代码

  • go-gin-example

本系列作者:煎鱼,原创授权发布

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值