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  }