// Example of a shared subscription which receives a subset of messages func sharedSub() { _, err := broker.Subscribe(topic, func(p broker.Publication) error { fmt.Println("[sub] received message:", string(p.Message().Body), "header", p.Message().Header) return nil }, broker.QueueName("consumer")) if err != nil { fmt.Println(err) } }
func (s *rpcServer) Register() error { // parse address for host, port config := s.Options() var advt, host string var port int // check the advertise address first // if it exists then use it, otherwise // use the address if len(config.Advertise) > 0 { advt = config.Advertise } else { advt = config.Address } parts := strings.Split(advt, ":") if len(parts) > 1 { host = strings.Join(parts[:len(parts)-1], ":") port, _ = strconv.Atoi(parts[len(parts)-1]) } else { host = parts[0] } addr, err := extractAddress(host) if err != nil { return err } // register service node := ®istry.Node{ Id: config.Name + "-" + config.Id, Address: addr, Port: port, Metadata: config.Metadata, } node.Metadata["transport"] = config.Transport.String() node.Metadata["broker"] = config.Broker.String() node.Metadata["server"] = s.String() node.Metadata["registry"] = config.Registry.String() s.RLock() var endpoints []*registry.Endpoint for _, e := range s.handlers { // Only advertise non internal handlers if !e.Options().Internal { endpoints = append(endpoints, e.Endpoints()...) } } for e, _ := range s.subscribers { // Only advertise non internal subscribers if !e.Options().Internal { endpoints = append(endpoints, e.Endpoints()...) } } s.RUnlock() service := ®istry.Service{ Name: config.Name, Version: config.Version, Nodes: []*registry.Node{node}, Endpoints: endpoints, } log.Infof("Registering node: %s", node.Id) if err := config.Registry.Register(service); err != nil { return err } s.Lock() defer s.Unlock() for sb, _ := range s.subscribers { handler := s.createSubHandler(sb, s.opts) var opts []broker.SubscribeOption if queue := sb.Options().Queue; len(queue) > 0 { opts = append(opts, broker.QueueName(queue)) } sub, err := config.Broker.Subscribe(sb.Topic(), handler, opts...) if err != nil { return err } s.subscribers[sb] = []broker.Subscriber{sub} } return nil }