func main() { region := "us-east-1" queueName := "example_queue" numFetchers := 3 // set up an SQS service instance // note that you can modify the AWS config used - make your own sqsconsumer.AWSConfigOption // or just depend on ~/.aws/... or environment variables and don't pass any opts at all s, err := sqsconsumer.SQSServiceForQueue(queueName, sqsconsumer.OptAWSRegion(region)) if err != nil { log.Fatalf("Could not set up queue '%s': %s", queueName, err) } // set up a context which will gracefully cancel the worker on interrupt fetchCtx, cancelFetch := context.WithCancel(context.Background()) term := make(chan os.Signal, 1) signal.Notify(term, os.Interrupt, os.Kill) go func() { <-term log.Println("Starting graceful shutdown") cancelFetch() }() // set up metrics - note TrackMetrics does not run the http server, and uses expvar exposeMetrics() ms := expvar.NewInt(fmt.Sprintf("%s.success", queueName)) mf := expvar.NewInt(fmt.Sprintf("%s.fail", queueName)) mt := expvar.NewFloat(fmt.Sprintf("%s.time", queueName)) track := middleware.TrackMetrics(ms, mf, mt) // wrap the handler handler := middleware.ApplyDecoratorsToHandler(processMessage, track) // start the consumers log.Println("Starting queue consumers") wg := &sync.WaitGroup{} wg.Add(numFetchers) for i := 0; i < numFetchers; i++ { go func() { // create the consumer and bind it to a queue and processor function c := sqsconsumer.NewConsumer(s, handler) // start running the consumer with a context that will be cancelled when a graceful shutdown is requested c.Run(fetchCtx) wg.Done() }() } // wait for all the consumers to exit cleanly wg.Wait() log.Println("Shutdown complete") }
func (w *worker) Run(ctx context.Context) { sqs, err := sqsconsumer.SQSServiceForQueue(w.Queue) if err != nil { log.Fatalf("ERROR Could not set up queue '%s': %s\n", w.Queue, err) } // create the consumer bound to a queue and processor function and start running it with a context that will be cancelled when a graceful shutdown is requested log.Printf("Starting consumer for SQS queue: %s", w.Queue) sc := sqsconsumer.NewConsumer(sqs, w.HandleMessage) sc.Run(ctx) log.Println("Shutdown complete") }