gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/broker/service/handler/handler.go (about) 1 package handler 2 3 import ( 4 "context" 5 6 "gitee.com/liuxuezhan/go-micro-v1.18.0/broker" 7 pb "gitee.com/liuxuezhan/go-micro-v1.18.0/broker/service/proto" 8 "gitee.com/liuxuezhan/go-micro-v1.18.0/errors" 9 "gitee.com/liuxuezhan/go-micro-v1.18.0/util/log" 10 ) 11 12 type Broker struct { 13 Broker broker.Broker 14 } 15 16 func (b *Broker) Publish(ctx context.Context, req *pb.PublishRequest, rsp *pb.Empty) error { 17 log.Debugf("Publishing message to %s topic", req.Topic) 18 err := b.Broker.Publish(req.Topic, &broker.Message{ 19 Header: req.Message.Header, 20 Body: req.Message.Body, 21 }) 22 log.Debugf("Published message to %s topic", req.Topic) 23 if err != nil { 24 return errors.InternalServerError("go.micro.broker", err.Error()) 25 } 26 return nil 27 } 28 29 func (b *Broker) Subscribe(ctx context.Context, req *pb.SubscribeRequest, stream pb.Broker_SubscribeStream) error { 30 errChan := make(chan error, 1) 31 32 // message handler to stream back messages from broker 33 handler := func(p broker.Event) error { 34 if err := stream.Send(&pb.Message{ 35 Header: p.Message().Header, 36 Body: p.Message().Body, 37 }); err != nil { 38 select { 39 case errChan <- err: 40 return err 41 default: 42 return err 43 } 44 } 45 return nil 46 } 47 48 log.Debugf("Subscribing to %s topic", req.Topic) 49 sub, err := b.Broker.Subscribe(req.Topic, handler, broker.Queue(req.Queue)) 50 if err != nil { 51 return errors.InternalServerError("go.micro.broker", err.Error()) 52 } 53 defer func() { 54 log.Debugf("Unsubscribing from topic %s", req.Topic) 55 sub.Unsubscribe() 56 }() 57 58 select { 59 case <-ctx.Done(): 60 log.Debugf("Context done for subscription to topic %s", req.Topic) 61 return nil 62 case err := <-errChan: 63 log.Debugf("Subscription error for topic %s: %v", req.Topic, err) 64 return err 65 } 66 }