/
poller.go
58 lines (48 loc) 路 951 Bytes
/
poller.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
package mon
import (
"errors"
"time"
)
// PollHandler provides a poll method
type PollHandler interface {
Poll(time.Time)
}
// Poller polls the docker socket at an interval, to find containers
type Poller struct {
IntervalMs int64
Handler PollHandler
tickerComplete chan bool
ticker *time.Ticker
running bool
}
// Start begins polling
func (p *Poller) Start() error {
if p.running {
return errors.New("Already running")
}
p.tickerComplete = make(chan bool)
p.ticker = time.NewTicker(time.Duration(p.IntervalMs) * time.Millisecond)
p.running = true
// run the ticker
go func() {
for {
select {
case <-p.tickerComplete:
return
case t := <-p.ticker.C:
p.Handler.Poll(t)
}
}
}()
return nil
}
// Stop ends polling
func (p *Poller) Stop() error {
if !p.running {
return errors.New("Not running")
}
p.tickerComplete <- true
p.ticker.Stop()
p.running = false
return nil
}