func SetupEndpoints() { // create Publisher ep := Config.Endpoints var broker *mqtt.Broker if ep.Mqtt.Broker != "" { broker = mqtt.NewBroker(ep.Mqtt.Broker) Publisher = broker.Publisher() } else if ep.Nanomsg.Pub != "" { Publisher = nanomsg.NewPublisher(ep.Nanomsg.Pub, true) } if Publisher == nil { log.Fatalln("Failed to initialise pub endpoint") } // create Subscriber if ep.Mqtt.Broker != "" { Subscriber = broker.Subscriber() } else if ep.Nanomsg.Sub != "" { Subscriber = nanomsg.NewSubscriber(ep.Nanomsg.Sub, "", true) } if Subscriber == nil { log.Fatalln("Failed to initialise sub endpoint") } // listen for config changes go ConfigWatcher() // listen for commands go QuerySubscriber() }
func (self *Service) Run() error { ep := services.Config.Endpoints routing := map[pubsub.Subscriber][]pubsub.Publisher{} // setup subscribers var subscribers []pubsub.Subscriber var publishers []pubsub.Publisher if ep.Nanomsg.Pub != "" { sub := nanomsg.NewSubscriber(ep.Nanomsg.Pub, "", false) subscribers = append(subscribers, sub) } if ep.Mqtt.Broker != "" { broker := mqtt.NewBroker(ep.Mqtt.Broker) pub := broker.Publisher() publishers = append(publishers, pub) for _, sub := range subscribers { routing[sub] = append(routing[sub], pub) } // do not add the mqtt publisher to the mqtt subscriber, otherwise // this creates a loop. The mqtt broker itself relays messages. sub := broker.Subscriber() subscribers = append(subscribers, sub) } // setup publishers if ep.Nanomsg.Sub != "" { pub := nanomsg.NewPublisher(ep.Nanomsg.Sub, false) publishers = append(publishers, pub) for _, sub := range subscribers { routing[sub] = append(routing[sub], pub) } } log.Println("Subscriber endpoints:") for _, sub := range subscribers { log.Println("-", sub.ID()) } log.Println("Publisher endpoints:") for _, pub := range publishers { log.Println("-", pub.ID()) } // Copy from subscribers to publishers var wg sync.WaitGroup wg.Add(len(subscribers)) for _, sub := range subscribers { // for each subscriber go func(sub pubsub.Subscriber) { pubs := routing[sub] // wait for an event for ev := range sub.Channel() { // send the event onto publishers for _, pub := range pubs { pub.Emit(ev) } atomic.AddUint64(&self.Processed, 1) } wg.Done() }(sub) } wg.Wait() return nil }