package main import ( "fmt" "log" "math" "net/http" "os" "time" amqp "github.com/rabbitmq/amqp091-go" ) const webPort = "80" type Config struct { Rabbit *amqp.Connection } func main() { // try to connect to rabbitmq rabbitConn, err := connect() if err != nil { log.Println(err) os.Exit(1) } defer rabbitConn.Close() log.Println("Connected to RabbitMQ") app := Config{ Rabbit: rabbitConn, } log.Printf("Starting broker service on port %s\n", webPort) // define http server srv := &http.Server{ Addr: fmt.Sprintf(":%s", webPort), Handler: app.routes(), } err = srv.ListenAndServe() if err != nil { log.Panic(err) } } func connect() (*amqp.Connection, error) { var counts int64 var connection *amqp.Connection // don't continue until rabbit is ready for { c, err := amqp.Dial("amqp://guest:guest@rabbitmq") // XXX: credentials if err != nil { fmt.Println("RabbitMQ not yet ready...") counts++ } else { connection = c break } if counts > 5 { fmt.Println(err) return nil, err } backOff := time.Duration(math.Pow(float64(counts), 2) * float64(time.Second)) log.Println("backing off...") time.Sleep(backOff) } return connection, nil }