gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/broker/service/subscriber.go (about) 1 package service 2 3 import ( 4 "gitee.com/liuxuezhan/go-micro-v1.18.0/broker" 5 pb "gitee.com/liuxuezhan/go-micro-v1.18.0/broker/service/proto" 6 "gitee.com/liuxuezhan/go-micro-v1.18.0/util/log" 7 ) 8 9 type serviceSub struct { 10 topic string 11 queue string 12 handler broker.Handler 13 stream pb.Broker_SubscribeService 14 closed chan bool 15 options broker.SubscribeOptions 16 } 17 18 type serviceEvent struct { 19 topic string 20 message *broker.Message 21 } 22 23 func (s *serviceEvent) Topic() string { 24 return s.topic 25 } 26 27 func (s *serviceEvent) Message() *broker.Message { 28 return s.message 29 } 30 31 func (s *serviceEvent) Ack() error { 32 return nil 33 } 34 35 func (s *serviceSub) isClosed() bool { 36 select { 37 case <-s.closed: 38 return true 39 default: 40 return false 41 } 42 } 43 44 func (s *serviceSub) run() error { 45 exit := make(chan bool) 46 go func() { 47 select { 48 case <-exit: 49 case <-s.closed: 50 } 51 52 // close the stream 53 s.stream.Close() 54 }() 55 56 for { 57 // TODO: do not fail silently 58 msg, err := s.stream.Recv() 59 if err != nil { 60 log.Debugf("Streaming error for subcription to topic %s: %v", s.Topic(), err) 61 62 // close the exit channel 63 close(exit) 64 65 // don't return an error if we unsubscribed 66 if s.isClosed() { 67 return nil 68 } 69 70 // return stream error 71 return err 72 } 73 74 // TODO: handle error 75 s.handler(&serviceEvent{ 76 topic: s.topic, 77 message: &broker.Message{ 78 Header: msg.Header, 79 Body: msg.Body, 80 }, 81 }) 82 } 83 } 84 85 func (s *serviceSub) Options() broker.SubscribeOptions { 86 return s.options 87 } 88 89 func (s *serviceSub) Topic() string { 90 return s.topic 91 } 92 93 func (s *serviceSub) Unsubscribe() error { 94 select { 95 case <-s.closed: 96 return nil 97 default: 98 close(s.closed) 99 } 100 return nil 101 }