74 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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
 | 
						|
}
 |