2016-03-23 7 views
2

Wie in den RabbitMQ-Dokumenten erwähnt, sind TCP-Verbindungen teuer in der Herstellung. Also, für dieses Konzept des Kanals wurde eingeführt. Jetzt stieß ich auf diese example. In der main() erstellt es die Verbindung jedes Mal, wenn eine Nachricht veröffentlicht wird. conn, err := amqp.Dial("amqp://guest:[email protected]:5672/"). Sollte es nicht einmal global deklariert werden, sollte es einen Failover-Mechanismus geben, falls die Verbindung wie ein Singleton-Objekt geschlossen wird. Wenn amqp.Dial Thread-sicher ist, was ich glaube, es sollteOb eine Verbindung jedes Mal erstellt wird, wenn amqp.Dial threadsafe ist oder nicht in go lang

Edited Frage:

Ich bin Umgang mit dem Verbindungsfehler in der folgenden Weise. In dem ich auf einen Kanal höre und bei einem Fehler eine neue Verbindung erstelle. Aber wenn ich die bestehende Verbindung abbringe und versuche, eine Nachricht zu veröffentlichen. Ich erhalte den folgenden Fehler.

Fehler:

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) 

    } 
+0

Soweit ich die Verbindung nur sehen kann, ist eine Zeit in den verknüpften Proben erstellen. Sie sollten den entsprechenden Code in Ihre Frage einfügen. – Sebastian

+0

Nein, aber sagen wir, ich habe einen http-Handler, der jedes Mal aufgerufen wird, wenn Sie ein Objekt in die Warteschlange schieben müssen. Also, sollten wir bei jeder Anfrage eine Verbindung zu rabbitmq herstellen oder nur eine Verbindung verwenden. – Naresh

Antwort

8

Natürlich sollten Sie nicht eine Verbindung für jede Anforderung erstellen. Machen Sie es zu einer globalen Variablen oder besser Teil einer application context, die Sie beim Start einmalig initialisieren.

können Sie Verbindungsfehler behandeln durch einen Kanal Registrierung mit Connection.NotifyClose:

func initialize() { 
    c := make(chan *amqp.Error) 
    go func() { 
    err := <-c 
    log.Println("reconnect: " + err.Error()) 
    initialize() 
    }() 

    conn, err := amqp.Dial("amqp://guest:[email protected]:5672/") 
    if err != nil { 
    panic("cannot connect") 
    } 
    conn.NotifyClose(c) 

    // create topology 
} 
+0

Könnten Sie bitte näher ausführen. Ich bin neu zu gehen. Also, habe nicht viel Ahnung. Ich habe die Frage bearbeitet. Könnten Sie bitte auf den Fehler hinweisen, wo ich falsch liege? – Naresh

+0

Erneutes Deklarieren der Topologie (Erstellen von Kanälen usw.) beim erneuten Verbinden? – Sebastian

+0

Nein, ich erstelle nur die Verbindung neu. Wie Sie im Code sehen können. Ich habe meine Frage eingefügt – Naresh