func newConsumerFileLogger(topic string) (*ConsumerFileLogger, error) { f, err := NewFileLogger(*gzipEnabled, *gzipLevel, *filenameFormat, topic) if err != nil { return nil, err } cfg := nsq.NewConfig() cfg.UserAgent = fmt.Sprintf("nsq_to_file/%s go-nsq/%s", version.Binary, nsq.VERSION) err = app.ParseOpts(cfg, consumerOpts) if err != nil { return nil, err } cfg.MaxInFlight = *maxInFlight consumer, err := nsq.NewConsumer(topic, *channel, cfg) if err != nil { return nil, err } consumer.AddHandler(f) err = consumer.ConnectToNSQDs(nsqdTCPAddrs) if err != nil { log.Fatal(err) } err = consumer.ConnectToNSQLookupds(lookupdHTTPAddrs) if err != nil { log.Fatal(err) } return &ConsumerFileLogger{ C: consumer, F: f, }, nil }
func main() { // Make sure we flush the log before quitting: defer log.Flush() // Process the arguments: argumentIssue := processArguments() if argumentIssue { os.Exit(1) } // Intercept quit signals: sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) // Don't ask for more messages than we want if *bucketMessages > 0 && *bucketMessages < *maxInFlight { *maxInFlight = *bucketMessages } // Set up the NSQ client: cfg := nsq.NewConfig() cfg.UserAgent = fmt.Sprintf("nsq_to_s3/%s go-nsq/%s", version.Binary, nsq.VERSION) err := app.ParseOpts(cfg, consumerOpts) if err != nil { panic(err) } cfg.MaxInFlight = *maxInFlight consumer, err := nsq.NewConsumer(*topic, *channel, cfg) if err != nil { panic(err) } // See which mode we've been asked to run in: switch *batchMode { case "disk": { // On-disk: messageHandler := &OnDiskHandler{ allTimeMessages: 0, deDuper: make(map[string]int), inFlightMessages: make([]*nsq.Message, 0), timeLastFlushedToS3: int(time.Now().Unix()), timeLastFlushedToDisk: int(time.Now().Unix()), } // Add the handler: consumer.AddHandler(messageHandler) } case "channel": { panic("'channel' batch-mode isn't implemented yet!") } default: { // Default to in-memory: messageHandler := &InMemoryHandler{ allTimeMessages: 0, deDuper: make(map[string]int), messageBuffer: make([]*nsq.Message, 0), timeLastFlushedToS3: int(time.Now().Unix()), } // Add the handler: consumer.AddHandler(messageHandler) } } // Configure the NSQ connection with the list of NSQd addresses: err = consumer.ConnectToNSQDs(nsqdTCPAddrs) if err != nil { panic(err) } // Configure the NSQ connection with the list of Lookupd HTTP addresses: err = consumer.ConnectToNSQLookupds(lookupdHTTPAddrs) if err != nil { panic(err) } // Handle stop / quit events: for { select { case <-consumer.StopChan: return case <-sigChan: consumer.Stop() os.Exit(0) } } }
func main() { flag.Parse() if len(*topic) == 0 { log.Fatal("--topic required") } if len(*delimiter) != 1 { log.Fatal("--delimiter must be a single byte") } stopChan := make(chan bool) termChan := make(chan os.Signal, 1) signal.Notify(termChan, syscall.SIGINT, syscall.SIGTERM) cfg := nsq.NewConfig() cfg.UserAgent = fmt.Sprintf("to_nsq/%s go-nsq/%s", version.Binary, nsq.VERSION) err := app.ParseOpts(cfg, producerOpts) if err != nil { log.Fatal(err) } // make the producers producers := make(map[string]*nsq.Producer) for _, addr := range destNsqdTCPAddrs { producer, err := nsq.NewProducer(addr, cfg) if err != nil { log.Fatalf("failed to create nsq.Producer - %s", err) } producers[addr] = producer } if len(producers) == 0 { log.Fatal("--nsqd-tcp-address required") } r := bufio.NewReader(os.Stdin) delim := (*delimiter)[0] go func() { for { err := readAndPublish(r, delim, producers) if err != nil { if err != io.EOF { log.Fatal(err) } close(stopChan) break } } }() select { case <-termChan: case <-stopChan: } for _, producer := range producers { producer.Stop() } }
func main() { var selectedMode int flag.Parse() if *showVersion { fmt.Printf("nsq_to_nsq v%s\n", version.Binary) return } if *topic == "" || *channel == "" { log.Fatal("--topic and --channel are required") } if *destTopic == "" { *destTopic = *topic } if !protocol.IsValidTopicName(*topic) { log.Fatal("--topic is invalid") } if !protocol.IsValidTopicName(*destTopic) { log.Fatal("--destination-topic is invalid") } if !protocol.IsValidChannelName(*channel) { log.Fatal("--channel is invalid") } if len(nsqdTCPAddrs) == 0 && len(lookupdHTTPAddrs) == 0 { log.Fatal("--nsqd-tcp-address or --lookupd-http-address required") } if len(nsqdTCPAddrs) > 0 && len(lookupdHTTPAddrs) > 0 { log.Fatal("use --nsqd-tcp-address or --lookupd-http-address not both") } if len(destNsqdTCPAddrs) == 0 { log.Fatal("--destination-nsqd-tcp-address required") } switch *mode { case "round-robin": selectedMode = ModeRoundRobin case "hostpool": selectedMode = ModeHostPool } termChan := make(chan os.Signal, 1) signal.Notify(termChan, syscall.SIGINT, syscall.SIGTERM) defaultUA := fmt.Sprintf("nsq_to_nsq/%s go-nsq/%s", version.Binary, nsq.VERSION) cCfg := nsq.NewConfig() cCfg.UserAgent = defaultUA err := app.ParseOpts(cCfg, consumerOpts) if err != nil { log.Fatal(err) } cCfg.MaxInFlight = *maxInFlight // TODO: remove, deprecated if hasArg("max-backoff-duration") { log.Printf("WARNING: --max-backoff-duration is deprecated in favor of --consumer-opt=max_backoff_duration,X") cCfg.MaxBackoffDuration = *maxBackoffDuration } pCfg := nsq.NewConfig() pCfg.UserAgent = defaultUA err = app.ParseOpts(pCfg, producerOpts) if err != nil { log.Fatal(err) } consumer, err := nsq.NewConsumer(*topic, *channel, cCfg) if err != nil { log.Fatal(err) } producers := make(map[string]*nsq.Producer) for _, addr := range destNsqdTCPAddrs { producer, err := nsq.NewProducer(addr, pCfg) if err != nil { log.Fatalf("failed creating producer %s", err) } producers[addr] = producer } perAddressStatus := make(map[string]*timer_metrics.TimerMetrics) if len(destNsqdTCPAddrs) == 1 { // disable since there is only one address perAddressStatus[destNsqdTCPAddrs[0]] = timer_metrics.NewTimerMetrics(0, "") } else { for _, a := range destNsqdTCPAddrs { perAddressStatus[a] = timer_metrics.NewTimerMetrics(*statusEvery, fmt.Sprintf("[%s]:", a)) } } handler := &PublishHandler{ addresses: destNsqdTCPAddrs, producers: producers, mode: selectedMode, hostPool: hostpool.New(destNsqdTCPAddrs), respChan: make(chan *nsq.ProducerTransaction, len(destNsqdTCPAddrs)), perAddressStatus: perAddressStatus, timermetrics: timer_metrics.NewTimerMetrics(*statusEvery, "[aggregate]:"), } consumer.AddConcurrentHandlers(handler, len(destNsqdTCPAddrs)) for i := 0; i < len(destNsqdTCPAddrs); i++ { go handler.responder() } err = consumer.ConnectToNSQDs(nsqdTCPAddrs) if err != nil { log.Fatal(err) } err = consumer.ConnectToNSQLookupds(lookupdHTTPAddrs) if err != nil { log.Fatal(err) } for { select { case <-consumer.StopChan: return case <-termChan: consumer.Stop() } } }
func main() { flag.Parse() if *showVersion { fmt.Printf("nsq_tail v%s\n", version.Binary) return } if *channel == "" { rand.Seed(time.Now().UnixNano()) *channel = fmt.Sprintf("tail%06d#ephemeral", rand.Int()%999999) } if *topic == "" { log.Fatal("--topic is required") } if len(nsqdTCPAddrs) == 0 && len(lookupdHTTPAddrs) == 0 { log.Fatal("--nsqd-tcp-address or --lookupd-http-address required") } if len(nsqdTCPAddrs) > 0 && len(lookupdHTTPAddrs) > 0 { log.Fatal("use --nsqd-tcp-address or --lookupd-http-address not both") } sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) // Don't ask for more messages than we want if *totalMessages > 0 && *totalMessages < *maxInFlight { *maxInFlight = *totalMessages } cfg := nsq.NewConfig() cfg.UserAgent = fmt.Sprintf("nsq_tail/%s go-nsq/%s", version.Binary, nsq.VERSION) err := app.ParseOpts(cfg, consumerOpts) if err != nil { log.Fatal(err) } cfg.MaxInFlight = *maxInFlight consumer, err := nsq.NewConsumer(*topic, *channel, cfg) if err != nil { log.Fatal(err) } consumer.AddHandler(&TailHandler{totalMessages: *totalMessages}) err = consumer.ConnectToNSQDs(nsqdTCPAddrs) if err != nil { log.Fatal(err) } err = consumer.ConnectToNSQLookupds(lookupdHTTPAddrs) if err != nil { log.Fatal(err) } for { select { case <-consumer.StopChan: return case <-sigChan: consumer.Stop() } } }
func main() { var publisher Publisher var addresses app.StringArray var selectedMode int flag.Parse() if *showVersion { fmt.Printf("nsq_to_http v%s\n", version.Binary) return } if *topic == "" || *channel == "" { log.Fatal("--topic and --channel are required") } if *contentType != flag.Lookup("content-type").DefValue { if len(postAddrs) == 0 { log.Fatal("--content-type only used with --post") } if len(*contentType) == 0 { log.Fatal("--content-type requires a value when used") } } if len(nsqdTCPAddrs) == 0 && len(lookupdHTTPAddrs) == 0 { log.Fatal("--nsqd-tcp-address or --lookupd-http-address required") } if len(nsqdTCPAddrs) > 0 && len(lookupdHTTPAddrs) > 0 { log.Fatal("use --nsqd-tcp-address or --lookupd-http-address not both") } if len(getAddrs) == 0 && len(postAddrs) == 0 { log.Fatal("--get or --post required") } if len(getAddrs) > 0 && len(postAddrs) > 0 { log.Fatal("use --get or --post not both") } if len(getAddrs) > 0 { for _, get := range getAddrs { if strings.Count(get, "%s") != 1 { log.Fatal("invalid GET address - must be a printf string") } } } switch *mode { case "multicast": log.Printf("WARNING: multicast mode is deprecated in favor of using separate nsq_to_http on different channels (and will be dropped in a future release)") selectedMode = ModeAll case "round-robin": selectedMode = ModeRoundRobin case "hostpool", "epsilon-greedy": selectedMode = ModeHostPool } // TODO: remove, deprecated if hasArg("--round-robin") { log.Printf("WARNING: --round-robin is deprecated in favor of --mode=round-robin") selectedMode = ModeRoundRobin } // TODO: remove, deprecated if hasArg("throttle-fraction") { log.Printf("WARNING: --throttle-fraction is deprecatedin favor of --sample=X") *sample = *throttleFraction } if *sample > 1.0 || *sample < 0.0 { log.Fatal("ERROR: --sample must be between 0.0 and 1.0") } // TODO: remove, deprecated if hasArg("http-timeout-ms") { log.Printf("WARNING: --http-timeout-ms is deprecated in favor of --http-timeout=X") *httpTimeout = time.Duration(*httpTimeoutMs) * time.Millisecond } termChan := make(chan os.Signal, 1) signal.Notify(termChan, syscall.SIGINT, syscall.SIGTERM) if len(postAddrs) > 0 { publisher = &PostPublisher{} addresses = postAddrs } else { publisher = &GetPublisher{} addresses = getAddrs } cfg := nsq.NewConfig() cfg.UserAgent = fmt.Sprintf("nsq_to_http/%s go-nsq/%s", version.Binary, nsq.VERSION) err := app.ParseOpts(cfg, consumerOpts) if err != nil { log.Fatal(err) } cfg.MaxInFlight = *maxInFlight // TODO: remove, deprecated if hasArg("max-backoff-duration") { log.Printf("WARNING: --max-backoff-duration is deprecated in favor of --consumer-opt=max_backoff_duration,X") cfg.MaxBackoffDuration = *maxBackoffDuration } consumer, err := nsq.NewConsumer(*topic, *channel, cfg) if err != nil { log.Fatal(err) } perAddressStatus := make(map[string]*timer_metrics.TimerMetrics) if len(addresses) == 1 { // disable since there is only one address perAddressStatus[addresses[0]] = timer_metrics.NewTimerMetrics(0, "") } else { for _, a := range addresses { perAddressStatus[a] = timer_metrics.NewTimerMetrics(*statusEvery, fmt.Sprintf("[%s]:", a)) } } hostPool := hostpool.New(addresses) if *mode == "epsilon-greedy" { hostPool = hostpool.NewEpsilonGreedy(addresses, 0, &hostpool.LinearEpsilonValueCalculator{}) } handler := &PublishHandler{ Publisher: publisher, addresses: addresses, mode: selectedMode, hostPool: hostPool, perAddressStatus: perAddressStatus, timermetrics: timer_metrics.NewTimerMetrics(*statusEvery, "[aggregate]:"), } consumer.AddConcurrentHandlers(handler, *numPublishers) err = consumer.ConnectToNSQDs(nsqdTCPAddrs) if err != nil { log.Fatal(err) } err = consumer.ConnectToNSQLookupds(lookupdHTTPAddrs) if err != nil { log.Fatal(err) } for { select { case <-consumer.StopChan: return case <-termChan: consumer.Stop() } } }