Rabbitmq Amqp Reconnect

Die Golang Libary github.com/streadway/amqp bietet mit der NotifyClose Funktion die Möglichkeit, sich über Fehler in der Connection mittels eines Channel zu informieren. Dies kann gut dazu genutzt werden, einen automatischen Re-Connect zu implementieren. Ein Möglichkeit findet sich auf ninefinity.org.

Ich habe das ganze etwas anders umgesetzt, scheint bis jetzt auch gut zu funktionieren.

func (i *ownstruct) ReconnectOnErr(infochan chan string) {
        rchan := make(chan *amqp.Error)
        i.conn.NotifyClose(rchan)
        for {
                <-rchan
                infochan <- "Message Bus ist weg"
                for {
                        conn, err := amqp.Dial(i.dialstring)
                        if err == nil {
                                i.conn = conn
                                nr := make(chan *amqp.Error)
                                rchan = i.conn.NotifyClose(nr)
                                infochan <- "Message Bus wieder da"
                                break
                        }
                        infochan <- "Reconnect Fehler"
                        time.Sleep(3 * time.Second)
                }
        }
}

Entscheidend war es, dem rchan die Rückgabe von NotifyClose zu geben. Anderfalls klappt das nicht. Die Funktion wird dann als go Funktion aufgerufen.