@@ -17,9 +17,8 @@ import (
1717
1818type MessageOutputStream = grpc.ServerStreamingServer [netinternal.QueueMessage ]
1919type OnlineConsumer struct {
20- id uint64
21- stream MessageOutputStream
22- closeChannel chan <- interface {}
20+ id uint64
21+ stream MessageOutputStream
2322}
2423type QueueServer struct {
2524 netinternal.UnimplementedQueueServiceServer
@@ -56,6 +55,12 @@ func (qs *QueueServer) Enqueue(_ context.Context, req *netinternal.EnqueueReques
5655 return & netinternal.EnqueueRequestResponse {Success : true }, nil
5756}
5857
58+ func removeClosedConsumers (closedChannels []uint64 , consumers []* OnlineConsumer ) []* OnlineConsumer {
59+ return internal .Filter (consumers , func (consumer * OnlineConsumer ) bool {
60+ return ! internal .Contains (closedChannels , consumer .id )
61+ })
62+ }
63+
5964func (qs * QueueServer ) broadcastMessage () {
6065 var closedChannels []uint64
6166 mu := sync.Mutex {}
@@ -68,23 +73,21 @@ func (qs *QueueServer) broadcastMessage() {
6873 mu .Lock ()
6974 defer mu .Unlock ()
7075 qs .queueService .RevertDequeue (int (consumer .id ))
71- consumer .closeChannel <- "closed"
7276 closedChannels = append (closedChannels , consumer .id )
7377 }
7478 }(consumer )
7579 }
7680 wg .Wait ()
77- qs .onlineConsumer = internal .Filter (qs .onlineConsumer , func (consumer * OnlineConsumer ) bool {
78- return ! internal .Contains (closedChannels , consumer .id )
79- })
81+ qs .onlineConsumer = removeClosedConsumers (closedChannels , qs .onlineConsumer )
8082}
8183
8284func (qs * QueueServer ) ObserveQueue (req * netinternal.ObserveQueueRequest , stream grpc.ServerStreamingServer [netinternal.QueueMessage ]) error {
83- closeChannel := make (chan interface {})
84- consumer := & OnlineConsumer {id : req .ConsumerId , stream : stream , closeChannel : closeChannel }
85+ consumer := & OnlineConsumer {id : req .ConsumerId , stream : stream }
8586 _ = qs .serveMessages (consumer )
8687 qs .onlineConsumer = append (qs .onlineConsumer , consumer )
87- <- closeChannel
88+ <- stream .Context ().Done ()
89+ closedConsumers := []uint64 {req .ConsumerId }
90+ qs .onlineConsumer = removeClosedConsumers (closedConsumers , qs .onlineConsumer )
8891 return nil
8992}
9093
0 commit comments