2016-03-23 15 views
2

Tcp bağlantılarının yapılması pahalı olan RabbitMQ belgelerinde belirtildiği gibi. Yani, bu kanal kavramı için tanıtıldı. Şimdi bu example ile karşılaştım. main()'da, bir iletinin her yayınlandığında bağlantı oluşturur. conn, err := amqp.Dial("amqp://guest:[email protected]:5672/"). Küresel olarak bir kez bildirilmemeli ve bağlantının tekil nesne gibi kapanması durumunda yük devretme mekanizması bulunmalıdır.amqp.Dial iş parçacığı her zaman olduğunda olsun ya da olmasın bağlantı oluşturuluyor

aşağıdaki şekilde bağlantı hatası işleme ediyorum: amqp.Dial herhalde, hangi evreli ise o

Düzenlenen soru olmalıdır. Kanalda dinledim ve hata üzerine yeni bir bağlantı oluşturdum. Ancak mevcut bağlantıyı öldürdüğümde mesaj yayınlamaya çalışıyorum. Aşağıdaki hatayı alıyorum.

hatası:

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 

Kodu:

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

Bildiğim kadarıyla bağlantı yalnızca bağlantılı numunelerde bir kez oluşturmak olduğunu görebilirsiniz. Sorunuza ilgili kodu eklemelisiniz. – Sebastian

+0

Hayır, ancak sıradaki bir nesneyi itmeye ihtiyaç duyduğunuz her zaman çağrılan bir http işleyicisi olduğumu varsayalım. Yani, her istek üzerine rabbitmq için bağlantı oluşturmalı ya da sadece bir bağlantı kullanmalıyız. – Naresh

cevap

8

Tabii ki, her istek için bir bağlantı oluşturmamalıdır. Başlangıçta bir kez başlattığınız bir global değişken veya application context'un daha iyi bir parçası olun.

Sen Connection.NotifyClose kullanarak bir kanal kaydederek bağlantı hataları işleyebilir:

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

Daha ayrıntılı olarak detaylandırır mısınız? Gitmek için yeniyim. Yani, fazla fikrin yok. Soruyu düzenledim. Hatalı olduğum yeri işaret edebilir misiniz? – Naresh

+0

Yeniden bağlandığınızda topolojinizi (kanallar vb. Oluşturuyor) yeniden bildiriyor musunuz? – Sebastian

+0

Hayır, yalnızca bağlantıyı yeniden oluşturuyorum. Kodda gördüğünüz gibi. – Naresh

İlgili konular