Ob die Verbindung jedes Mal hergestellt werden soll, wenn amqp.Dial threadsicher ist oder nicht in go lang

Wie in den RabbitMQ-Dokumenten erwähnt, sind TCP-Verbindungen teuer in der Herstellung. Also wurde für dieses Konzept der Kanal eingeführt. Jetzt bin ich auf dieses @ gestoßBeispie. In demmain() es erstellt die Verbindung jedes Mal, wenn eine Nachricht veröffentlicht wird.conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/"). Sollte es nicht einmal global deklariert werden und es sollte einen Failover-Mechanismus geben, falls die Verbindung wie ein Singleton-Objekt geschlossen wird. Wenn amqp.Dial thread-safe ist, was ich denke, sollte es sein

Bearbeitete Frage:

Ich behandle den Verbindungsfehler auf folgende Weise. In dem ich einen Kanal abhöre und bei Fehler eine neue Verbindung herstelle. Aber wenn ich die bestehende Verbindung abbringe und versuche, eine Nachricht zu veröffentlichen. Ich erhalte die folgende Fehlermeldung.

Error

2016/03/30 19:20:08 Failed to open a channel: write tcp 172.16.5.48:51085->172.16.0.20:5672: use of closed network connection
exit status 1
7:25 PM

Code:

 func main() {

        Conn, err := amqp.Dial("amqp://guest:[email protected]:5672/")
        failOnError(err, "Failed to connect to RabbitMQ")
         context := &appContext{queueName: "QUEUENAME",exchangeName: "ExchangeName",exchangeType: "direct",routingKey: "RoutingKey",conn: Conn}
        c := make(chan *amqp.Error)

        go func() {
            error := <-c
            if(error != nil){                
                Conn, err = amqp.Dial("amqp://guest:[email protected]:5672/")            
                failOnError(err, "Failed to connect to RabbitMQ")            
                Conn.NotifyClose(c)                                           
            }            
        }()

        Conn.NotifyClose(c)
        r := web.New()
        // We pass an instance to our context pointer, and our handler.
        r.Get("/", appHandler{context, IndexHandler})
        graceful.ListenAndServe(":8086", r)  

    }

Antworten auf die Frage(2)

Ihre Antwort auf die Frage