package main import ( "context" "fmt" "log" "os" "os/signal" "github.com/nats-io/nats.go" ) func cancelationSignal() context.Context { c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) ctx, cancel := context.WithCancel(context.Background()) go func() { <-c cancel() }() return ctx } func listenChannel(title string, ch chan *nats.Msg) { for msg := range ch { fmt.Printf("%s received message: %s\n", title, string(msg.Data)) } } func main() { ctx := cancelationSignal() nc, err := nats.Connect(nats.DefaultURL) if err != nil { log.Fatal(err) } defer nc.Drain() balanceCh := make(chan *nats.Msg) nc.QueueSubscribeSyncWithChan("test1", "balance", balanceCh) go listenChannel("[Balance]", balanceCh) transactionCh := make(chan *nats.Msg) nc.QueueSubscribeSyncWithChan("test1", "transaction", transactionCh) go listenChannel("[Transaction:first]", transactionCh) go listenChannel("[Transaction:second]", transactionCh) <-ctx.Done() }