func (router *PubSubRouter) Go() *PubSubRouter { go func() { for { func() { defer guble.PanicLogger() select { case message := <-router.messageIn: router.handleMessage(message) runtime.Gosched() case subscriber := <-router.subscribeChan: router.subscribe(subscriber.route) subscriber.doneNotify <- true case unsubscriber := <-router.unsubscribeChan: router.unsubscribe(unsubscriber.route) unsubscriber.doneNotify <- true case <-router.stop: router.closeAllRoutes() guble.Debug("stopping message router") break } }() } }() return router }
func writeLoop(client *client.Client) { shouldStop := false for !shouldStop { func() { defer guble.PanicLogger() reader := bufio.NewReader(os.Stdin) text, _ := reader.ReadString('\n') if strings.TrimSpace(text) == "" { return } if strings.TrimSpace(text) == "?" || strings.TrimSpace(text) == "help" { printHelp() return } if strings.HasPrefix(text, ">") { fmt.Print("header: ") header, _ := reader.ReadString('\n') text += header fmt.Print("body: ") body, _ := reader.ReadString('\n') text += strings.TrimSpace(body) } if args.Verbose { log.Printf("Sending: %v\n", text) } if err := client.WriteRawMessage([]byte(text)); err != nil { shouldStop = true guble.Err(err.Error()) } }() } }
func (router *PubSubRouter) deliverMessage(route Route, message *guble.Message) { defer guble.PanicLogger() select { case route.C <- MsgAndRoute{Message: message, Route: &route}: // fine, we could send the message default: guble.Info("queue was full, closing delivery for route=%v to applicationId=%v", route.Path, route.ApplicationId) close(route.C) router.unsubscribe(&route) } }