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.