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  }