// 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.Queue("consumer")) if err != nil { fmt.Println(err) } }
func (c *conn) writeLoop() { ticker := time.NewTicker(pingTime) var opts []broker.SubscribeOption if len(c.queue) > 0 { opts = append(opts, broker.Queue(c.queue)) } subscriber, err := (*cmd.DefaultOptions().Broker).Subscribe(c.topic, func(p broker.Publication) error { b, err := json.Marshal(p.Message()) if err != nil { return nil } return c.write(websocket.TextMessage, b) }, opts...) defer func() { subscriber.Unsubscribe() ticker.Stop() c.ws.Close() }() if err != nil { log.Print(err.Error()) return } for { select { case <-ticker.C: if err := c.write(websocket.PingMessage, []byte{}); err != nil { return } case <-c.exit: return } } }
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, } s.Lock() registered := s.registered s.Unlock() if !registered { log.Printf("Registering node: %s", node.Id) } // create registry options rOpts := []registry.RegisterOption{registry.RegisterTTL(config.RegisterTTL)} if err := config.Registry.Register(service, rOpts...); err != nil { return err } // already registered? don't need to register subscribers if registered { return nil } s.Lock() defer s.Unlock() s.registered = true 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.Queue(queue)) } sub, err := config.Broker.Subscribe(sb.Topic(), handler, opts...) if err != nil { return err } s.subscribers[sb] = []broker.Subscriber{sub} } return nil }