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
|
package main
import (
"fmt"
"github.com/robfig/cron/v3"
log "github.com/sirupsen/logrus"
"time"
)
// 定时任务计划
/*
- spec,传入 cron 时间设置
- job,对应执行的任务
*/
func StartJob(spec string, job Job) {
logger := &CLog{clog: log.New()}
logger.clog.SetFormatter(&log.TextFormatter{
FullTimestamp: true,
TimestampFormat: "2006-01-02 15:04:05",
})
c := cron.New(cron.WithChain(cron.SkipIfStillRunning(logger)))
c.AddJob(spec, &job)
// 启动执行任务
c.Start()
// 退出时关闭计划任务
defer c.Stop()
// 如果使用 select{} 那么就一直会循环
select {
case <-job.Shut:
return
}
}
func StopJob(shut chan int) {
shut <- 0
}
type CLog struct {
clog *log.Logger
}
func (l *CLog) Info(msg string, keysAndValues ...interface{}) {
l.clog.WithFields(log.Fields{
"data": keysAndValues,
}).Info(msg)
}
func (l *CLog) Error(err error, msg string, keysAndValues ...interface{}) {
l.clog.WithFields(log.Fields{
"msg": msg,
"data": keysAndValues,
}).Warn(msg)
}
type Job struct {
A int `json:"a"`
B int `json:"b"`
C string `json:"c"`
Shut chan int `json:"shut"`
}
// implement Run() interface to start job
func (j *Job) Run() {
j.A++
fmt.Printf("A: %d\n", j.A)
j.B++
fmt.Printf("B: %d\n", j.B)
j.C += "str"
fmt.Printf("C: %s\n", j.C)
}
func main() {
job1 := Job{
A: 0,
B: 1,
C: "",
Shut: make(chan int, 1),
}
// 每分钟执行一次
go StartJob("*/1 * * * *", job1)
time.Sleep(time.Minute * 3)
}
/*
output
A: 1
B: 2
C: str
A: 2
B: 3
C: strstr
A: 3
B: 4
C: strstrstr
*/
|