-
Notifications
You must be signed in to change notification settings - Fork 3
/
cron.go
92 lines (82 loc) · 2.53 KB
/
cron.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package cronKit
import (
"github.com/richelieu-yang/chimera/v2/src/core/errorKit"
"github.com/richelieu-yang/chimera/v2/src/core/interfaceKit"
"github.com/richelieu-yang/chimera/v2/src/core/strKit"
"github.com/robfig/cron/v3"
)
// NewCron
/*
!!!:
(1) 想要通过修改机器时间来验证的话,需要先改时间,再启动cron.
(2) 返回的 *cron.Cron实例 要调用 Run() || Start() 以启动
(a) Run() 会阻塞 调用此方法的goroutine,
(b) Start() 不会阻塞 调用此方法的goroutine
定时任务-表达式
https://goframe.org/pages/viewpage.action?pageId=30736411
Go 每日一库之定时任务库:cron
https://mp.weixin.qq.com/s/swdijAro2k8LuYu7q_La1A
cron表达式,每天凌晨0点执行定时任务
https://www.cnblogs.com/yddwinter/p/16033633.html
e.g. spec
"0 0 0 * * *" 每天凌晨0点执行
"* * * * * *" 每秒执行
"30 * * * * *" 每分钟的第30s,执行一次
"15,30 * * * * *" 每分钟的第15s、第30s,各执行一次
"@every 10s" 从启动(调用Run() || Start())开始,每 10s 执行一次
"@every 1m" 从启动(调用Run() || Start())开始,每 1min 执行一次
"@hourly" 从启动(调用Run() || Start())开始,每 1h 执行一次
"@every 1h30m" 从启动(调用Run() || Start())开始,每 1.5h 执行一次
*/
func NewCron() *cron.Cron {
// cron.WithSeconds(): 带"秒"
return cron.New(cron.WithSeconds())
}
// NewCronWithTask
/*
@param spec "@every 10s" || "@every 1m",更多可参考"Golang - 1.docx"
*/
func NewCronWithTask(spec string, task func()) (*cron.Cron, cron.EntryID, error) {
if err := strKit.AssertNotBlank(spec, "spec"); err != nil {
return nil, 0, err
}
if err := interfaceKit.AssertNotNil(task, "task"); err != nil {
return nil, 0, err
}
c := NewCron()
entryId, err := c.AddFunc(spec, task)
if err != nil {
return nil, 0, err
}
return c, entryId, nil
}
func NewCronWithJob(spec string, job cron.Job) (*cron.Cron, cron.EntryID, error) {
if strKit.IsBlank(spec) {
return nil, 0, errorKit.New("spec is blank")
}
if job == nil {
return nil, 0, errorKit.New("job == nil")
}
c := NewCron()
entryId, err := c.AddJob(spec, job)
if err != nil {
return nil, 0, err
}
return c, entryId, nil
}
// StopCron
/*
!!!:
(1) 调用此函数可能会 阻塞 调用的goroutine.
(2) 可以多次调用 Cron.Stop(),虽然只有第一次有意义,但至少不会panic
*/
func StopCron(c *cron.Cron) {
if c == nil {
return
}
ctx := c.Stop()
// 如果存在正在执行的任务,会阻塞直到它完成
select {
case <-ctx.Done():
}
}