package main import ( "fmt" "log" "os" "os/signal" "syscall" amqp "github.com/rabbitmq/amqp091-go" rabbitmq "github.com/wagslane/go-rabbitmq" ) var consumerName = "example" func main() { consumer, err := rabbitmq.NewConsumer( "amqp://guest:guest@localhost", amqp.Config{}, rabbitmq.WithConsumerOptionsLogging, ) if err != nil { log.Fatal(err) } // wait for server to acknowledge the cancel const noWait = false defer consumer.Disconnect() defer consumer.StopConsuming(consumerName, noWait) err = consumer.StartConsuming( func(d rabbitmq.Delivery) rabbitmq.Action { log.Printf("consumed: %v", string(d.Body)) // rabbitmq.Ack, rabbitmq.NackDiscard, rabbitmq.NackRequeue return rabbitmq.Ack }, "my_queue", []string{"routing_key", "routing_key_2"}, rabbitmq.WithConsumeOptionsConcurrency(10), rabbitmq.WithConsumeOptionsQueueDurable, rabbitmq.WithConsumeOptionsQuorum, rabbitmq.WithConsumeOptionsBindingExchangeName("events"), rabbitmq.WithConsumeOptionsBindingExchangeKind("topic"), rabbitmq.WithConsumeOptionsBindingExchangeDurable, rabbitmq.WithConsumeOptionsConsumerName(consumerName), ) if err != nil { log.Fatal(err) } // block main thread - wait for shutdown signal sigs := make(chan os.Signal, 1) done := make(chan bool, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) go func() { sig := <-sigs fmt.Println() fmt.Println(sig) done <- true }() fmt.Println("awaiting signal") <-done fmt.Println("stopping consumer") }