/
EventsToGo.go
108 lines (82 loc) · 2.28 KB
/
EventsToGo.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package EventsToGo
import (
"log"
"time"
"github.com/JKolios/EventsToGo/consumers"
"github.com/JKolios/EventsToGo/events"
"github.com/JKolios/EventsToGo/producers"
"github.com/oleiade/lane"
)
type TaskQueue struct {
events *lane.PQueue
eventTTL *time.Duration
producers []producers.Producer
producerChan chan events.Event
consumers []consumers.Consumer
consumerChannels []chan events.Event
done chan struct{}
producersRunning, consumersRunning bool
}
func NewQueue(EventTTL *time.Duration) *TaskQueue {
queue := &TaskQueue{eventTTL: EventTTL}
queue.events = lane.NewPQueue(lane.MAXPQ)
queue.done = make(chan struct{})
return queue
}
func (queue *TaskQueue) AddConsumer(consumer consumers.Consumer) {
queue.consumers = append(queue.consumers, consumer)
}
func (queue *TaskQueue) AddProducer(producer producers.Producer) {
queue.producers = append(queue.producers, producer)
}
func (queue *TaskQueue) TaskCount() int {
return queue.events.Size()
}
func (queue *TaskQueue) Start() {
if !queue.consumersRunning {
queue.StartConsumers()
}
if !queue.producersRunning {
queue.StartProducers()
}
}
func (queue *TaskQueue) StartProducers() {
if queue.producersRunning {
log.Println("Producers are already running.")
return
}
queue.producerChan = make(chan events.Event)
for _, producer := range queue.producers {
producer.Start(queue.producerChan)
}
go queue.producerHub()
queue.producersRunning = true
}
func (queue *TaskQueue) StartConsumers() {
if queue.consumersRunning {
log.Println("Consumers are already running.")
return
}
for _, consumer := range queue.consumers {
queue.consumerChannels = append(queue.consumerChannels, consumer.Start())
}
go queue.consumerHub()
queue.consumersRunning = true
}
func (queue *TaskQueue) Stop() {
queue.StopProducers()
queue.StopConsumers()
close(queue.done)
}
func (queue *TaskQueue) StopProducers() {
for _, producer := range queue.producers {
producer.Stop()
}
queue.producersRunning = false
}
func (queue *TaskQueue) StopConsumers() {
for _, consumer := range queue.consumers {
consumer.Stop()
}
queue.consumersRunning = false
}