-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathspecs.go
More file actions
104 lines (89 loc) · 2.34 KB
/
specs.go
File metadata and controls
104 lines (89 loc) · 2.34 KB
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
93
94
95
96
97
98
99
100
101
102
103
104
package schedule
import (
"fmt"
"github.com/robfig/cron/v3"
)
// RunAt 在某一时刻执行
//
// 重复地在某个时间点执行任务
//
// crontabExpr Linux crontab风格的表达式
//
// * * * * *
//
// - - - - -
//
// | | | | |
//
// | | | | +----- day of week (0 - 7) (Sunday=0 or 7) OR sun...sat
//
// | | | +---------- month (1 - 12) OR jan,feb,mar,apr ...
//
// | | +--------------- day of month (1 - 31)
//
// | +-------------------- hour (0 - 23)
//
// +------------------------- minute (0 - 59)
func (j *taskJob) RunAt(crontabExpr string) (cancel CancelFunc) {
cronStartOnce.Do(func() {
cronJob = cron.New()
cronJob.Start()
})
//因为AddFunc内部是协程启动,因此这里的方法使用同步方式调用
j.wrappedTaskFunc = func() {
j.running = true
defer func() {
j.running = false
}()
if !j.withoutOverlapping {
j.task()
return
}
if lockDriver.tryLock(j.lockerKey) {
defer func() {
lockDriver.unlock(j.lockerKey)
j.lockedByMe = false
}()
j.lockedByMe = true
j.task()
}
}
jobID, jobErr := cronJob.AddFunc(crontabExpr, j.wrappedTaskFunc)
if jobErr != nil {
fmt.Printf("[GO-SAIL] <Schedule> add job {%s} failed: %v\n", j.name, jobErr.Error())
}
cancel = func() {
go func() {
cronJob.Remove(jobID)
taskSchedules.mux.Lock()
delete(taskSchedules.pool, j.lockerKey)
taskSchedules.mux.Unlock()
fmt.Printf("[GO-SAIL] <Schedule> cancel job {%s} successfully\n", j.name)
}()
}
return
}
// TenClockAtWeekday 每个工作日(周一~周五)上午10点
func (j *taskJob) TenClockAtWeekday() (cancel CancelFunc) {
return j.RunAt(TenClockAtWeekday)
}
// TenClockAtWeekend 每个周末(周六和周日)上午10点
func (j *taskJob) TenClockAtWeekend() (cancel CancelFunc) {
return j.RunAt(TenClockAtWeekend)
}
// FirstDayOfMonthly 每月1号
func (j *taskJob) FirstDayOfMonthly() (cancel CancelFunc) {
return j.RunAt(FirstDayOfMonth)
}
// LastDayOfMonthly 每月最后一天
func (j *taskJob) LastDayOfMonthly() (cancel CancelFunc) {
return j.RunAt(LastDayOfMonth)
}
// FirstDayOfWeek 每周1的00:00
func (j *taskJob) FirstDayOfWeek() (cancel CancelFunc) {
return j.RunAt(FirstDayOfWeek)
}
// LastDayOfWeek 每周天的00:00
func (j *taskJob) LastDayOfWeek() (cancel CancelFunc) {
return j.RunAt(LastDayOfWeek)
}