-
Notifications
You must be signed in to change notification settings - Fork 1
/
scheduler.go
63 lines (52 loc) · 1.63 KB
/
scheduler.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
package scheduler
import "github.com/robfig/cron/v3"
// Scheduler is a struct that defines an instance of a scheduler.
// It holds the tasks (`[]*tasks`).
type Scheduler struct {
tasks []*task
c *cron.Cron
}
type task struct {
cron *cron.Cron
}
// TaskFunc is the function type that should be used
// when adding tasks to the scheduler
type TaskFunc func()
// nilLogger is a logger that will be used with `cron`.
// We don't need extra logging so better explicitly not logging anything ¯\_(ツ)_/¯
type nilLogger struct{}
func (l *nilLogger) Info(msg string, keysAndValues ...interface{}) {
return
}
func (l *nilLogger) Error(err error, msg string, keysAndValues ...interface{}) {
return
}
// New returns a new empty scheduler.
// To this scheduler one would need to add tasks using
// `NewTask` and then start it using `Start`
// s := scheduler.New()
// s.NewTask("* * * * *", func() { fmt.Println("Hello, world") })
// s.Start()
func New() *Scheduler {
return &Scheduler{
tasks: []*task{},
c: cron.New(cron.WithSeconds(), cron.WithLogger(&nilLogger{})),
}
}
// Start starts the scheduler. This should be called after adding tasks
// using NewTask, as it's currently impossible to add tasks to an already started
// scheduler.
func (s *Scheduler) Start() error {
s.c.Start()
return nil
}
// NewTask adds a new scheduler task. It receives a cron formatted string
// and a function of the type `TaskFunc` that's defined in this package.
func (s *Scheduler) NewTask(cronfmt string, fn func()) error {
_, err := s.c.AddFunc(cronfmt, fn)
return err
}
// Stop gracefully stops the cron scheduler
func (s *Scheduler) Stop() {
s.c.Stop()
}