@@ -2,7 +2,12 @@ package main
2
2
3
3
import (
4
4
"fmt"
5
+ "log"
6
+ "os"
7
+ "os/signal"
8
+ "strings"
5
9
"sync"
10
+ "syscall"
6
11
7
12
"github.com/felipeagger/go-redis-streams/consumer/handler"
8
13
"github.com/felipeagger/go-redis-streams/packages/event"
@@ -11,12 +16,15 @@ import (
11
16
)
12
17
13
18
const (
14
- streamName = "events"
19
+ streamName = "events"
20
+ consumerGroup = "consumersOne"
21
+ consumerName = "consumerOne"
15
22
)
16
23
17
24
var (
18
- mutex sync.Mutex
19
- start string = "-"
25
+ waitGrp sync.WaitGroup
26
+ mutex sync.Mutex
27
+ start string = ">" //"0" //"0-0" //"-"
20
28
)
21
29
22
30
func main () {
@@ -25,12 +33,30 @@ func main() {
25
33
panic (err )
26
34
}
27
35
28
- fmt . Printf ( "Initializing consumer on Stream: %v ... \n " , streamName )
36
+ createConsumerGroup ( client )
29
37
38
+ fmt .Printf ("Initializing consumerGroup: %v on Stream: %v ...\n " , consumerGroup , streamName )
30
39
go consumeEvents (client )
31
40
32
- quit := make (chan bool )
33
- <- quit
41
+ //Gracefully end
42
+ chanOS := make (chan os.Signal )
43
+ signal .Notify (chanOS , syscall .SIGINT , syscall .SIGTERM )
44
+ <- chanOS
45
+
46
+ waitGrp .Wait ()
47
+ client .Close ()
48
+ }
49
+
50
+ func createConsumerGroup (client * redis.Client ) {
51
+
52
+ if _ , err := client .XGroupCreateMkStream (streamName , consumerGroup , "0" ).Result (); err != nil {
53
+
54
+ if ! strings .Contains (fmt .Sprint (err ), "BUSYGROUP" ) {
55
+ fmt .Printf ("Error on create Consumer Group: %v ...\n " , consumerGroup )
56
+ panic (err )
57
+ }
58
+
59
+ }
34
60
}
35
61
36
62
// start consume events
@@ -39,13 +65,31 @@ func consumeEvents(client *redis.Client) {
39
65
for {
40
66
func () {
41
67
42
- redisRange , err := client .XRange (streamName , start , "+" ).Result ()
68
+ /*
69
+ redisRange, err := client.XRange(streamName, start, "+").Result()
70
+ if err != nil {
71
+ panic(err)
72
+ }
73
+ */
74
+
75
+ streams , err := client .XReadGroup (& redis.XReadGroupArgs {
76
+ Streams : []string {streamName , start },
77
+ Group : consumerGroup ,
78
+ Consumer : consumerName ,
79
+ //NoAck: true,
80
+ Count : 10 ,
81
+ Block : 0 , // Wait for new messages without a timeout.
82
+ }).Result ()
43
83
if err != nil {
44
- panic (err )
84
+ log .Printf ("err: %+v\n " , err )
85
+ return
45
86
}
46
87
47
- for _ , stream := range redisRange {
88
+ fmt .Println ("new round" )
89
+
90
+ for _ , stream := range streams [0 ].Messages {
48
91
92
+ waitGrp .Add (1 )
49
93
go processStream (stream , client , handler .HandlerFactory ())
50
94
51
95
}
@@ -56,6 +100,7 @@ func consumeEvents(client *redis.Client) {
56
100
}
57
101
58
102
func processStream (stream redis.XMessage , client * redis.Client , handlerFactory func (t event.Type ) handler.Handler ) {
103
+ defer waitGrp .Done ()
59
104
60
105
typeEvent := stream .Values ["type" ].(string )
61
106
newEvent , _ := event .New (event .Type (typeEvent ))
@@ -73,13 +118,25 @@ func processStream(stream redis.XMessage, client *redis.Client, handlerFactory f
73
118
if err != nil {
74
119
fmt .Printf ("error on process event:%v\n " , newEvent )
75
120
fmt .Println (err )
121
+
122
+ client .XClaimJustID (& redis.XClaimArgs {
123
+ Stream : streamName ,
124
+ Group : consumerGroup ,
125
+ Consumer : "consumerTwo" ,
126
+ Messages : []string {stream .ID },
127
+ //MinIdle: 5 * time.Second,
128
+ })
76
129
return
77
130
}
78
131
79
132
//Delete stream from redis
80
- client .XDel (streamName , stream .ID )
81
-
82
- mutex .Lock ()
83
- start = stream .ID
84
- mutex .Unlock ()
133
+ //client.XDel(streamName, stream.ID)
134
+ client .XAck (streamName , consumerGroup , stream .ID )
135
+
136
+ /*
137
+ mutex.Lock()
138
+ start = stream.ID
139
+ //fmt.Printf("new start: %v \n", start)
140
+ mutex.Unlock()
141
+ */
85
142
}
0 commit comments